看看这个answer on SO,我对下面的“原则”感到有点困惑:
应用好莱坞原则
好莱坞原则在DI术语中说:不要调用DI容器,它会给您打电话。
永远不要通过在代码中调用容器来直接请求依赖项。通过使用构造函数注入隐式地请求它。
但是,如果我的DAL中有一个存储库类,并且我希望将这个实例提供给一个在TCP/IP客户机连接时创建的对象,该怎么办?我应该在什么地方注射?
现在,我有这样的事情:
// gets created when a new TCP/IP client is connected
class Worker
{
private readonly IClient client;
public Worker(IClient client)
{
// get the repository
var repo = IoC.GetInstance<IClientMessagesRepo>();
// create an object which will parse messages
var parser = new MessageParser(client);
// create an object which will save them to repo
var logger = new MessageLogger(parser, repo);
}
}显然,当我的应用程序启动时,我无法创建这个实例。那我该在哪里注射回购?
非常感谢!
发布于 2011-07-25 13:04:21
您应该努力只调用IoC.GetInstance()一次。
由于您无法在启动时创建工作人员,所以应该创建一个WorkerFactory,并让DI容器将依赖项注入到其中:
public class WorkerFactory
{
private readonly IClientMessagesRepo clientMessagesRepo;
public WorkerFactory(IClientMessagesRepo clientMessagesRepo)
{
this.clientMessagesRepo = clientMessagesRepo;
}
public Worker Create(IClient client)
{
return new Worker(client, clientMessagesRepo);
}
}发布于 2011-07-25 11:41:10
将IClientMessagesRepo移动到构造函数参数:
public Worker(IClient client,IClientMessagesRepo clientMessagesRepo)当然,这只会将问题移到创建工作人员的程度。当然,在某个时候,对IoC容器的调用是必要的。但在这些情况下,我宁愿以参数的形式传入容器,也不愿从静态属性访问容器。或者使用某种工厂。
发布于 2011-07-25 11:45:10
在您的参数中包含IClientMessagesRepo,让IoC为您填充以下内容:
public Worker(IClient client, IClientMessagesRepo repo)
{
[...]
}显然,构造函数应该做的不仅仅是创建几个局部变量,但是您了解了这一点。
https://stackoverflow.com/questions/6815457
复制相似问题