首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >依赖注入-正确的位置注入

依赖注入-正确的位置注入
EN

Stack Overflow用户
提问于 2011-07-25 11:35:23
回答 4查看 287关注 0票数 2

看看这个answer on SO,我对下面的“原则”感到有点困惑:

应用好莱坞原则

好莱坞原则在DI术语中说:不要调用DI容器,它会给您打电话。

永远不要通过在代码中调用容器来直接请求依赖项。通过使用构造函数注入隐式地请求它。

但是,如果我的DAL中有一个存储库类,并且我希望将这个实例提供给一个在TCP/IP客户机连接时创建的对象,该怎么办?我应该在什么地方注射?

现在,我有这样的事情:

代码语言:javascript
复制
// 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);
    }
}

显然,当我的应用程序启动时,我无法创建这个实例。那我该在哪里注射回购?

非常感谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-07-25 13:04:21

您应该努力只调用IoC.GetInstance()一次。

由于您无法在启动时创建工作人员,所以应该创建一个WorkerFactory,并让DI容器将依赖项注入到其中:

代码语言:javascript
复制
public class WorkerFactory
{
    private readonly IClientMessagesRepo clientMessagesRepo;
    public WorkerFactory(IClientMessagesRepo clientMessagesRepo)
    {
        this.clientMessagesRepo = clientMessagesRepo;
    }

    public Worker Create(IClient client)
    {
        return new Worker(client, clientMessagesRepo);
    }
}
票数 1
EN

Stack Overflow用户

发布于 2011-07-25 11:41:10

IClientMessagesRepo移动到构造函数参数:

代码语言:javascript
复制
public Worker(IClient client,IClientMessagesRepo clientMessagesRepo)

当然,这只会将问题移到创建工作人员的程度。当然,在某个时候,对IoC容器的调用是必要的。但在这些情况下,我宁愿以参数的形式传入容器,也不愿从静态属性访问容器。或者使用某种工厂。

票数 0
EN

Stack Overflow用户

发布于 2011-07-25 11:45:10

在您的参数中包含IClientMessagesRepo,让IoC为您填充以下内容:

代码语言:javascript
复制
public Worker(IClient client, IClientMessagesRepo repo)    
{
    [...]
}

显然,构造函数应该做的不仅仅是创建几个局部变量,但是您了解了这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6815457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档