dependency-injection - 关于工厂模式和依赖注入(inject)的得墨忒耳定律

标签 dependency-injection law-of-demeter

我有一个关于依赖注入(inject)的问题。

说我想创建一个类
调用它,WebGetTask

WebGetTask 需要对 HttpService 的依赖

错误代码 1
代码:

private HttpService  httpService;
...   
List<WebGetTask> list = new ArrayList<WebGetTask>();   
for(...)   
{   
   list.add(new WebGetTask(httpService)); 
}
...

行。我知道这很糟糕,因为 httpService 被注入(inject),但它从未使用过,除了在新的 WebGetTask 上创建


错误代码 2
代码:
private WebGetTaskFactory webGetTaskFactory;
...  
List<WebGetTask> list = new ArrayList<WebGetTask>();  
for(...)  
{   
    list.add(webGetTaskFactory.newTask());  
}  
...

我认为这更好,因为我们使用工厂
但...
但..

从我站立的地方,
我知道
在 WebGetTaskFactory
我们仍然在注入(inject)一个 HttpService 并且除了创建一个新的 WebGetTask 的唯一目的之外没有对它做任何事情

所以
回顾一下
我的问题是
我如何设计一个工厂类(WebGetTaskFactory),当新对象在其构造函数上需要依赖项(HttpService)而不简单地注入(inject)和传递依赖项(HttpService)时创建新对象(WebGetTask)?
或者更确切地说,这是这样做的方法吗?如果是这样,那么一切都很好,如果不是,那么请指导我如何正确使用DI和工厂模式。
谢谢。

最佳答案

我将假设您显示的代码是 DownloadManager 类的一部分,并且您通过构造函数注入(inject)依赖项。在这种情况下,我希望将所有内容粘合在一起的启动代码如下所示:

IHttpService httpService = new HttpService();
IWebGetTaskFactory webGetTaskFactory = new WebGetTaskFactory(httpService);
IDownloadManager downloadManager = new DownloadManager(webGetTaskFactory);

DownloadManager 类只知道 IWebGetTaskFactory 接口(interface)。它不知道IHttpService,从而满足得墨忒耳定律。

编辑:重新阅读您的问题后,您似乎担心自己没有“使用”工厂中的 HttpService,只是将其传递给新的 WebGetTask。还行吧。 WebGetTaskFactory 和 WebGetTask 都需要一个 HttpService 实例来完成它们的工作。这并不违反得墨忒耳定律。

关于dependency-injection - 关于工厂模式和依赖注入(inject)的得墨忒耳定律,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/791940/

相关文章:

oop - 得墨meter耳定律-数据对象

c# - 得墨忒耳法则也适用于属性(property)吗?

dependency-injection - DI 容器可以用作 session 状态的替代吗?

c# - 如何在单例类中使用 transient 记录器,简单注入(inject)器

c# - 如何基于同一个服务注册和解析多个组件

entity-framework - ObjectContext 永远不会从接口(interface)派生??当ObjectContext有多种类型时,如何应用DI/IoC?

ruby-on-rails - Demeter 定律是否也适用于标准的 ActiveRecord 对象方法?

javascript - 使用函数柯里化(Currying)在 typescript 中构建实用程序类

c++ - 试图理解适用于我的代码的 Demeter 法则

language-agnostic - 如何解决违反迪米特法则的问题?