DI和IoC的工厂方法

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;
            }
     }}


Cats萌萌
浏览 460回答 3
3回答

皈依舞

回答您对代码示例的评论Composition Root..您可以创建以下内容,但这不是服务定位器。public&nbsp;class&nbsp;CarFactory{ &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;readonly&nbsp;Func<Type,&nbsp;ICar>&nbsp;carFactory; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;CarFactory(Func<Type,&nbsp;ICar>&nbsp;carFactory) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.carFactory&nbsp;=&nbsp;carFactory; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;ICar&nbsp;CreateCar(Type&nbsp;carType) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;carFactory(carType); &nbsp;}这就是你的样子Composition Root使用UnityDI容器:Func<Type,&nbsp;ICar>&nbsp;carFactoryFunc&nbsp;=&nbsp;type&nbsp;=>&nbsp;(ICar)container.Resolve(type);container.RegisterInstance<CarFactory>(new&nbsp;CarFactory(carFactoryFunc));
打开App,查看更多内容
随时随地看视频慕课网APP