抽象工厂的依赖注入(Unity)

时间:2014-11-05 15:26:07

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

在我之前的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通过正确的sportsCar(宝马或大众)?

2 个答案:

答案 0 :(得分:1)

通过统一,你可以注册类型,让团结解决注入的问题,或者你可以创建对象,然后让团结注入它们。要回答你的问题,你需要后者,所以:

您需要注册CarManufacturer类型,但您还应注册SportsCar类型。假设您有两种类型 BMWSportsCar VWSportsCar 来实现 ISportsCar ,您需要将它们注册为命名类型,以便您(和团结)可以识别它们:

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

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

//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);

答案 1 :(得分:0)

我们使用命名约定让Abstract Factory以非常简洁的方式解析Unity中的依赖关系。如果有兴趣的话:https://dannyvanderkraan.wordpress.com/2015/06/29/real-world-example-of-dependency-injection-based-on-run-time-values/