9

当前版本的 StructureMap 是否支持 ASP .Net Web API、MVC 4 和 .NET Framework 4.5?

4

2 回答 2

14

如此处所述,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 在此处的评论中指出,这并不完全“正确”。既然你有了知识,就用看起来最好的东西。

于 2012-08-11T00:27:47.143 回答
8

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 依赖解析器

于 2012-08-29T19:00:22.523 回答