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

说我想创建一堂课
称之为WebGetTask

WebGetTask将需要对HttpService的依赖

错误代码1
码:

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

好。我知道这很不好,因为注入了httpService,但从未使用过,除了在新的WebGetTask上创建


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

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

从我站立的地方
我理解了
在WebGetTaskFactory中
我们仍然在注入HttpService,除了创建新的WebGetTask的唯一目的之外,什么都不做

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

最佳答案

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

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

DownloadManager类仅知道IWebGetTaskFactory接口。它不知道IHttpService,因此满足Demeter的法则。

编辑:在重新阅读您的问题之后,您似乎担心除了将其传递给新的WebGetTask之外,您没有在工厂中“使用” HttpService。还行吧。 WebGetTaskFactory和WebGetTask都需要一个HttpService实例来完成其工作。这并不违反Demeter法则。

10-08 06:35