当前版本的 StructureMap 是否支持 ASP .Net Web API、MVC 4 和 .NET Framework 4.5?
最佳答案
如上所述here ,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 的最佳能力解析任何类型,并在出现问题时抛出错误。我喜欢看到错误,因为它们告诉我我做错了什么。
但是,如果出现问题,API 预计 GetService
将返回 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 在评论中指出它并不完全“正确”。既然您已经掌握了知识,请使用看起来最好的东西。
关于.net - StructureMap 和 ASP .Net Web API 和 .Net Framework 4.5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11889275/