【问题标题】:How to resolve with Unity in .NET Web API如何在 .NET Web API 中使用 Unity 解决
【发布时间】:2016-02-06 13:24:02
【问题描述】:

在 Web API 项目中使用 Unity,我以标准方式在 UnityContainer 中注册了一个对象(类型为 MyService 实现 IMyService)。

public static class UnityConfig {
    public static void RegisterComponents() {
        var container = new UnityContainer();
        GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);

        // Register my type
        container.RegisterType<IMyService, MyService>();
    }
}

我像这样在我的一个类中解析对象(它不是控制器,所以我不能使用构造函数注入):

// Get object from container
var myService = (IMyService)GlobalConfiguration.Configuration.DependencyResolver
                    .GetService(typeof(IMyService));

这是正确的方法吗? 看起来很笨拙。有没有更简洁的方式进行这个调用,比如直接访问容器的Resolve&lt;T&gt;()方法?

(我可能会在这里分心,但我不熟悉将 Unity 与 Web API 结合使用并试图了解最佳实践。)

【问题讨论】:

  • 对于非控制器,为什么不将实例保持在静态(单例)中并从那里访问它?
  • 你从哪里调用代码?你说它是一个非控制器。是服务吗?用在什么地方?
  • 此代码位于我创建的自定义属性中,这使事情变得复杂。我对 Spock 的回答很满意(简而言之,我应该依赖依赖注入而不是直接调用 DependencyResolver),但事实证明 Unity 无法注入属性(请参阅 herehere),所以我的选择是保持我的代码原样或实现自定义 FilterAttributeFilterProvider。

标签: .net asp.net-web-api asp.net-web-api2 unity-container


【解决方案1】:

“那是正确的方式吗”?

一般来说,如果您使用正确的 DI 主体,答案是否定的。 您所做的是要求 DependencyResolver 解析服务 IMyService。 这也被称为Hollywood Principal:不要调用容器;它会打电话给你的。

这也与要求 Unity Container 解析 IMyService 没有什么不同。 IE Container.Resolve

最好的方法是使用适当的构造函数注入,如果不是属性注入或一些指定的注入模式 https://github.com/ninject/Ninject/wiki/Injection-Patterns

如果您的 DEPENDENCY 需要在许多类中频繁注入,您也可以考虑使用环境容器。但这不太可能。 What is the meaning of the word ambient in this comment from CommonServiceLocator?

还请注意,您使用 DependencyResolver 的类正在使用 DI 技术,即 .Resolve,它在类的外部是不可见的。 这也意味着组件不能被重用,因为外部世界在编译时无法确定它需要什么 DI。如果 DI 要求未注册,则可能导致运行时错误(如果 DEPENDENCY 尚未注册)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 2020-01-01
    相关资源
    最近更新 更多