StructureMap和ASP.Net Web API以及.Net Framework 4.5
StructureMap的当前版本是否支持ASP.Net Web API、MVC 4和.Net Framework 4.5?如上所述,Web API使用依赖项解析程序StructureMap和ASP.Net Web API以及.Net Framework 4.5,.net,dependency-injection,ioc-container,asp.net-web-api,structuremap,.net,Dependency Injection,Ioc Container,Asp.net Web Api,Structuremap,StructureMap的当前版本是否支持ASP.Net Web API、MVC 4和.Net Framework 4.5?如上所述,Web API使用依赖项解析程序 class StructureMapDependencyResolver : IDependencyResolver { public IDependencyScope BeginScope() { return this; } public object GetService(
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()
{
}
}
除此之外,新的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
只查找容器中注册的类型,如果出现问题,将返回nullserviceType.IsAbstract | | serviceType.IsInterface
被认为是决定使用哪种方法的足够好的检查。我最初的回答是直截了当和简单的,但@PHeiberg在这里的评论中指出,它并不完全“正确”。既然您已经掌握了相关知识,请使用看起来最好的工具。ASP.NET Web API发行版使用了依赖项解析器(接口的实现),并引入了新概念-依赖项范围(接口的实现)。正确地实现IDependencyScope很重要-如果实现正确,它允许在释放IDependencyScope时释放资源(在范围中创建)。并在请求结束时进行处理
当容器支持嵌套(或子)容器时,IDependencyScope工作得最好。StructureMap从版本2.6.1开始执行此操作
我写了一篇关于如何在Web API中配置StructureMap的文章:
您还可以查看Mike Wasson的文章:
StructureMap无法处理此处预期的依赖项解析。看看这个例子和Jeremy的评论:事实上这是可行的。Jeremy说,
TryGetInstance
只有在明确注册了serviceType
时才能解决GetInstance
仍将解析未注册但具体的类型。实例的解析将与您的代码一起工作。然而,我将我发布的链接解释为建议的“最佳实践”,因为Jeremy本人就是这样。我猜GetService方法应该返回null,而不是在容器无法解析类型时生成异常。我发现了一篇博客文章,其中包含了更多步骤:一个小修改(除非API在v5中发生了更改,否则我使用的是v4),您的StructureMappDependencyResolver缺少一个“IDependencyScope”声明
public object GetService(Type serviceType)
{
if (serviceType.IsAbstract || serviceType.IsInterface)
return ObjectFactory.TryGetInstance(serviceType);
else
return ObjectFactory.GetInstance(serviceType);
}