【问题标题】:StructureMap and ASP .Net Web API and .Net Framework 4.5StructureMap 和 ASP .Net Web API 和 .Net Framework 4.5
【发布时间】:2012-08-07 00:35:10
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    如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 在这里的 cmets 中指出它并不完全“正确”。既然你已经掌握了知识,那就用最好的吧。

    【讨论】:

    • StructureMap 不像这里预期的那样处理依赖关系解析。查看此示例和 Jeremy 的 cmets:ardalis.com/How-Do-I-Use-StructureMap-with-ASP.NET-MVC-3
    • 实际上这会起作用。 Jeremy 说 TryGetInstance 只有在 serviceType 被明确注册时才会解析。 GetInstance 仍将解析未注册但具体的类型。
    • 实例解析将适用于您的代码。但是,我将我发布的链接解释为建议的“最佳实践”,因为 Jeremy 本人 recommends it。我猜 GetService 方法应该返回 null,而不是在容器无法解析类型时生成异常。
    • 这个答案让我走上了正轨。我发现了一篇博文,其中包含更多步骤:ericsowell.com/blog/2011/1/20/…
    • 一个小修改(除非 API 在 v5 中发生了变化,我使用的是 v4),您的 StructureMapDependencyResolver 缺少“IDependencyScope”声明
    【解决方案2】:

    ASP.NET Web API Release 版本使用依赖解析器(IDependencyResolver 接口的实现),它还引入了新概念 - 依赖范围(IDependencyScope 接口的实现)。正确实现 IDependencyScope 很重要 - 如果正确实现,它允许在释放 IDependencyScope 时释放资源(在范围内创建)。并在请求结束时处理。

    当容器支持嵌套(或子)容器时,IDependencyScope 效果最好。 StructureMap 从 2.6.1 版开始。

    我写了一篇文章如何在Web API中配置StructureMap:Configuring StructureMap in ASP.NET WebAPI

    您还可以查看 Mike Wasson 的文章: Using the Web API Dependency Resolver

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 2013-02-27
      • 2019-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-30
      相关资源
      最近更新 更多