gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:21:17 25 4
gpt4 key购买 nike

自从我一直在使用依赖注入(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com