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在这里的评论中指出,这并不完全“正确”。现在你已经有了知识,可以使用最好的方法。

+0

StructureMap不处理解决依赖喜欢这里的预期。看看这个例子和杰里米的评论:http://ardalis.com/How-Do-I-Use-StructureMap-with-ASP.NET-MVC-3 – PHeiberg 2012-08-11 15:27:20

+0

实际上,这将工作。 Jeremy说'TryGetInstance'只有在'serviceType'被显式注册时才解析。 'GetInstance'仍然会解析未注册但具体的类型。 – kelloti 2012-08-11 15:44:12

+0

实例的解析将适用于您的代码。然而,我解释了我作为提议的“最佳实践”发布的链接,因为杰里米本人[推荐它](http://codebetter.com/jeremymiller/2011/01/23/if-you-are-using-structuremap-with -mvc3 - 请阅读 - 这/)。我猜GetService方法应该返回null,而不是在容器无法解析类型时生成异常。 – PHeiberg 2012-08-12 13:07:41

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