为了账号安全,请及时绑定邮箱和手机立即绑定

DI和IoC的工厂方法

DI和IoC的工厂方法

Cats萌萌 2019-07-11 21:20:01
DI和IoC的工厂方法我熟悉这些模式,但仍然不知道如何处理以下情况:public class CarFactory{      public CarFactory(Dep1,Dep2,Dep3,Dep4,Dep5,Dep6)      {      }      public ICar CreateCar(type)      {             switch(type)             {                case A:                    return new Car1(Dep1,Dep2,Dep3);                break;                case B:                    return new Car2(Dep4,Dep5,Dep6);                break;             }      }}一般来说,问题在于需要注入的引用量。如果有更多的汽车,情况会更糟。我想到的第一种方法是在工厂构造函数中注入Car1和Car2,但这是反对工厂方法的,因为工厂总是返回相同的对象。第二种方法是注入servicelocator,但它在任何地方都是反模式的。如何解决?编辑:备选办法1:public class CarFactory{      public CarFactory(IContainer container)      {         _container = container;      }      public ICar CreateCar(type)      {             switch(type)             {                case A:                    return _container.Resolve<ICar1>();                break;                case B:                      return _container.Resolve<ICar2>();                break;             }      }}可供选择的方法2(由于树中的依赖关系太多而难以使用):public class CarFactory{      public CarFactory()      {      }      public ICar CreateCar(type)      {             switch(type)             {                case A:                    return new Car1(new Dep1(),new Dep2(new Dep683(),new Dep684()),....)                break;                case B:                     return new Car2(new Dep4(),new Dep5(new Dep777(),new Dep684()),....)                break;             }      }}
查看完整描述

3 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

回答您对代码示例的评论Composition Root..您可以创建以下内容,但这不是服务定位器。

public class CarFactory{
    private readonly Func<Type, ICar> carFactory;

    public CarFactory(Func<Type, ICar> carFactory)
    {
       this.carFactory = carFactory;
    }

    public ICar CreateCar(Type carType)
    {
        return carFactory(carType);
 }

这就是你的样子Composition Root使用UnityDI容器:

Func<Type, ICar> carFactoryFunc = type => (ICar)container.Resolve(type);container.RegisterInstance<CarFactory>(new CarFactory(carFactoryFunc));


查看完整回答
反对 回复 2019-07-11
  • 3 回答
  • 0 关注
  • 459 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信