StructureMap和ASP .Net Web API和.Net Framework 4.5
当前版本的StructureMap是否支持ASP .Net Web API,MVC 4和.NET Framework 4.5?StructureMap和ASP .Net Web API和.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在这里的评论中指出,这并不完全“正确”。现在你已经有了知识,可以使用最好的方法。
ASP.NET Web API发布版本使用依赖关系解析器(实现了IDependencyResolver接口),并且它还引入了新概念 - 依赖范围(接口的实现IDependencyScope)。正确实施IDependencyScope非常重要 - 如果执行得当,它允许在IDependencyScope处置时释放资源(在范围内创建)。它在请求结束时处理。
当容器支持嵌套(或子)容器时,IDependencyScope的效果最佳。 StructureMap从版本2.6.1开始。
我写了一篇文章如何在网页API配置StructureMap:Configuring StructureMap in ASP.NET WebAPI
您也可以从迈克·沃森检查文章: Using the Web API Dependency Resolver
StructureMap不处理解决依赖喜欢这里的预期。看看这个例子和杰里米的评论:http://ardalis.com/How-Do-I-Use-StructureMap-with-ASP.NET-MVC-3 – PHeiberg 2012-08-11 15:27:20
实际上,这将工作。 Jeremy说'TryGetInstance'只有在'serviceType'被显式注册时才解析。 'GetInstance'仍然会解析未注册但具体的类型。 – kelloti 2012-08-11 15:44:12
实例的解析将适用于您的代码。然而,我解释了我作为提议的“最佳实践”发布的链接,因为杰里米本人[推荐它](http://codebetter.com/jeremymiller/2011/01/23/if-you-are-using-structuremap-with -mvc3 - 请阅读 - 这/)。我猜GetService方法应该返回null,而不是在容器无法解析类型时生成异常。 – PHeiberg 2012-08-12 13:07:41