【问题标题】:Dependency Injection with Abstract Factory (Unity)抽象工厂的依赖注入(Unity)
【发布时间】:2015-01-01 20:36:35
【问题描述】:

在我之前的question 中,我问过如何在 Unity 中注册我的抽象工厂。

现在我想使用依赖注入。

我有这样的课:

 public interface ICarManufacturer
{

}

public class CarManufacturer : ICarManufacturer
{

    private readonly ISportsCar sportsCar;
    public CarManufacturer(ISportsCar sportsCar )
    {
        this.sportsCar = sportsCar;
    }

    public void DoSomething()
    {
        sportsCar.Accelerate();
    }
}

我如何告诉 Unity 传递正确的跑车(BMW 或 Volkswagen)?

【问题讨论】:

    标签: dependency-injection unity-container abstract-factory


    【解决方案1】:

    我们使用命名约定让抽象工厂通过 Unity 以非常干净和简单的方式解析依赖项。如果大家有兴趣:https://dannyvanderkraan.wordpress.com/2015/06/29/real-world-example-of-dependency-injection-based-on-run-time-values/

    【讨论】:

      【解决方案2】:

      使用 unity,您可以注册类型并让 unity 确定要注入的内容,或者您​​可以创建对象然后让 unity 注入它们。要回答您的问题,您需要后者,所以:

      您需要注册您的 CarManufacturer 类型,但您还应该注册您的 SportsCar 类型。假设您有实现 ISportsCar 的两种类型 BMWSportsCarVWSportsCar,您需要将它们注册为命名类型,以便您(和统一)可以识别它们:

      container.RegisterType<ICarManufacturer,CarManufacturer>()
      container.RegisterType<ISportsCar, BMWSportsCar>("BMWSportsCar")
      container.RegisterType<ISportsCar, VWSportsCar>("VWSportsCar")
      

      当你想创建 CarManufactuer 实例时,你需要创建一个依赖覆盖来告诉 unity 你想使用哪个特定的跑车实现:

      //get the BMW sports car from the unity container
      DependencyOverride bmw = new DependencyOverride(typeof(ISportsCar)
                                   ,container.Resolve<ISportsCar>("BMWSportsCar")); 
      
      //and get an instance of the CarManufacturer class, passing in the bmw instance
      ICarManufacturer obj = container.Resolve<ICarManufacturer>(bmw);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 2012-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-01
        相关资源
        最近更新 更多