在我之前的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(宝马或大众)?
答案 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/