当前版本的 StructureMap 是否支持 ASP .Net Web API、MVC 4 和 .NET Framework 4.5?
2 回答
如此处所述,Web API 使用依赖解析器。
class StructureMapDependencyResolver : IDependencyResolver
{
public IDependencyScope BeginScope()
{
return this;
}
public object GetService(Type serviceType)
{
return ObjectFactory.GetInstance(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return ObjectFactory.GetInstances(serviceType);
}
public void Dispose()
{
}
}
在您的 Global.asax.cs 中,包含此行以注册依赖解析器:
GlobalConfiguration.Configuration.DependencyResolver = new StructureMapDependencyResolver();
除此之外,新的 Web API 非常易于与 IoC 容器一起使用。
我还没有研究它,但我相信BeginScope
我留空的方法可以用于子容器。
编辑:
上述实现效果很好;事实上,我更喜欢它而不是我将要告诉你的替代方案。这个将解析任何类型到最好的 StructureMap 的能力,并且会在出现问题时抛出错误。我喜欢看到错误,因为它们告诉我我做错了什么。
GetService
但是,如果出现问题,API 预计将返回 null。所以为了符合 API,这是推荐的实现:
public object GetService(Type serviceType)
{
if (serviceType.IsAbstract || serviceType.IsInterface)
return ObjectFactory.TryGetInstance(serviceType);
else
return ObjectFactory.GetInstance(serviceType);
}
不同之处在于TryGetInstance
只查找在容器中注册的类型,如果出现问题将返回 null。serviceType.IsAbstract || serviceType.IsInterface
被认为足以决定使用哪种方法的检查。我最初的回答旨在简单明了,但@PHeiberg 在此处的评论中指出,这并不完全“正确”。既然你有了知识,就用看起来最好的东西。
ASP.NET Web API Release 版本使用依赖解析器(IDependencyResolver接口的实现),它还引入了新概念 - 依赖范围(IDependencyScope接口的实现)。正确实现 IDependencyScope 很重要 - 如果正确实现,它允许在释放 IDependencyScope 时释放资源(在范围内创建)。并在请求结束时处理。
当容器支持嵌套(或子)容器时,IDependencyScope 效果最好。StructureMap 从版本 2.6.1 开始。
我写了一篇如何在 Web API 中配置 StructureMap 的文章:在 ASP.NET WebAPI 中配置 StructureMap
您还可以查看 Mike Wasson 的文章: 使用 Web API 依赖解析器