c# - 依赖注入(inject)导致工厂激增?

标签 c# java oop dependency-injection factory-pattern

自从我一直在使用依赖注入(inject)原则以来,在处理需要实例化大量对象的类时,我总是感到不舒服。

例如,假设我有一个类应该引发许多不同类型的事件。每个事件都有不同的类型,所以我要做的是为每个不同的事件类型设置不同的工厂。如果我有 10 个事件,那么我就必须有 10 个工厂。那似乎不太好。我也可以为所有不同类型的事件建立一个工厂,但这似乎也不太对。

(对于 C# 人群,我在这里不是在谈论 .NET 的事件。这只是一个切入点的示例,只需将它们视为常规类即可!)

这只是一个例子。我在这里或那里有一个工厂没有问题,但在某些类型的项目中,人们必须在运行时创建很多对象,似乎我必须为我定义的几乎每个类创建一个工厂!

您如何处理这种情况?我错过了什么吗?

我看到人们只是传递对他们使用的 IoC 容器的引用,但这对我来说似乎没有任何好处。 IMO,域模型甚至不应该知道正在使用 IoC 容器!

谢谢

最佳答案

自从我了解 DI 以来,我就一直是构造函数注入(inject)的粉丝,因为在我看来,这就是构造函数的用途。它声明“我需要以下类/接口(interface)的实例才能完成我的工作”——例如传给我一个 File 和一个 PrintWriter,我会将前者的内容写入后者。

当然,这意味着代码不知道 DI 框架,因为类只是在构造时传入了所需的依赖项。此外,我认为在这种情况下不需要工厂,因为该类通过构造函数是它自己的工厂。


至于您在第二段中确定的场景,我不确定这是否与依赖注入(inject)严格相关,而只是类层次结构和职责的设计。 Either 你的类(class)知道如何创建一个 Event 对应于例如登录失败,在这种情况下它会这样做(即通过调用类的构造函数); 或者,它不知道怎么做,在这种情况下,它必须委托(delegate)给一些工厂来创建事件

在这种情况下,您可以将您的类设置为使用同一个工厂来创建所有十个事件(定义一个具有 10 个方法的 EventFactory 接口(interface)),或者您可以定义一个单独的工厂接口(interface)(&实现)对于需要构建的每种类型的事件。在后一种情况下,您还需要在主类的构造函数中传入十个不同的工厂。

但同样 - 这与 DI 恕我直言无关,这是一个问题,你如何设计你的类以实现灵 active (或“企业性”)与直截了当。在我看来,这两者是正交的;您首先定义您的类需要哪些协作者(十个工厂、一个工厂或零个工厂),然后您使用 DI 来提供这些依赖项。 DI 的存在与否不应影响您的类(class)设计。

关于c# - 依赖注入(inject)导致工厂激增?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6110043/

相关文章:

java - 如何删除java中的最后一个字符串

c# - 如何从更小的、可重用的查询中组合 Entity Framework 查询?

c# - 跨 ASP.NET Core Controller 共享变量和首次初始化

c# - 上传到数据库然后验证或验证每一行然后上传到数据库

java - 异常由于从互联网/本地引用 struts.dtd 文件

java - Java中数组太小怎么办?

ruby - Ruby 中的 bool 参数错误

javascript - ES6 静态方法与非静态和 ES5 OOP

c++ - 写在文件上,信息最终出现在控制台中

c# - 运行 Windows 服务时出现 FileNotFoundException