.net - StructureMap 和 ASP .Net Web API 和 .Net Framework 4.5

标签 .net dependency-injection ioc-container asp.net-web-api structuremap

当前版本的 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/

相关文章:

.net - 格式化 json 文档

java - 如何安排 spring 上下文配置文件以匹配项目依赖项?

ios - 使用Typhoon Assembly(plist方法)创建的AppDelegate创建了两次并且属性注入(inject)不起作用

c# - Caliburn Micro IoC/DI 工厂方法

c# - 使用 ASP.NET MVC 4 应用程序实例化 Unity 命名类型注册

c# - 具有静态和动态依赖关系的 IoC

asp.net - 无法加载程序集 : 'Microsoft.Practices.EnterpriseLibrary.Common'

c# - 在属性(property)中回归自己

.net - 在循环中声明的变量在循环的每次迭代中都保持值

dependency-injection - 何时使用 IOC 容器?