正确使用依赖注入模式

时间:2015-03-01 11:24:00

标签: c# dependency-injection unity-container ioc-container

我正在使用Unity IoC容器。

作文根:

   Container.RegisterType<IService, Service>(new ContainerControlledLifetimeManager());
   Container.RegisterType<IMyClass, MyClass>(new ContainerControlledLifetimeManager());
   Container.RegisterType<IMyClass2, MyClass2>(new ContainerControlledLifetimeManager());

IService注入MyClass

 public class MyClass : IMyClass
 {
        private readonly IService  _service;

        public MyClass(IService service)
        {
            _service = service;
        }

        void Do()
        {
            //get List<MyClass>
            var result = _service.GetData();

            var list = new List<IMyClass2>();

            // convert to List<IMyClass2>
            foreach (var item in result)
            {
                var myClass2 = Container.Resolve<IMyClass2>();
                myClass2.Data = item;
                list.Add(myClass2);
            }
        }
    }

问题是MyClass知道容器(解决IMyClass2)。这是否正确使用依赖注入?

如何正确解决这个问题?

更新

解决方案

该解决方案基于Wiktor Zychla post

向MyClass添加新依赖项。

public class MyClass : IMyClass
 {
        private readonly IService  _service;
        private readonly IMyClass2Factory _myClass2Factory;

        public MyClass(IService service, IMyClass2Factory myClass2Factory)
        {
            _service = service;
            _myClass2Factory = myClass2Factory;
        }

        void Do()
        {
            //get List<MyClass>
            var result = _service.GetData();

            var list = new List<IMyClass2>();

            // convert to List<IMyClass2>
            foreach (var item in result)
            {
                var myClass2 = _myClass2Factory.Create();
                myClass2.Data = item;
                list.Add(myClass2);
            }
        }
 }

抽象工厂。

public interface IMyClass2Factory() 
{
    IMyClass2 Create();
}

具有依赖关系Unity容器的混凝土工厂。

public class MyClass2Factory : IMyClass2Factory
{
   private readonly IUnityContainer _container;

   public MyClass2Factory(IUnityContainer container)
   {
       _container = container;
   }

   IMyClass2 Create()
   {
      return _container.Resolve<IMyClass2>();
   }
}

组成根:

   Container.RegisterType<IService, Service>(new ContainerControlledLifetimeManager());
   Container.RegisterType<IMyClass, MyClass>(new ContainerControlledLifetimeManager());
   Container.RegisterType<IMyClass2, MyClass2>(new ContainerControlledLifetimeManager());
   Container.RegisterInstance<IMyClass2Factory>(new IMyClass2Factory(Container));

起初,似乎我们已将问题移至另一个位置。

但它敏捷的解决方案现在MyClass不依赖于容器,可以使用不同的配置,例如关于单元测试项目。

恕我直言,抽象工厂取决于两个邪恶中的较小者。

0 个答案:

没有答案