我正在使用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
不依赖于容器,可以使用不同的配置,例如关于单元测试项目。
恕我直言,抽象工厂取决于两个邪恶中的较小者。