c# - 使用 Builder 类通过 DI 重新创建子对象集?

标签 c# oop dependency-injection builder

我有一个 Request 类,用于从外部进程检索文件资源,使用方法 RetrieveResource()。此方法大约需要 10-15 秒才能完成。此外,Request 类包含四个子对象,它们在类的构造过程中使用依赖注入(inject)进行实例化,以访问请求文件的内容。

Request 类是从项目的主类实例化而来的。主类大约每 30 秒调用一次 RetrieveResource()。每次调用后,可能需要调整 Request 类的一个或多个子对象的特定属性,例如属性 A。

我很想听听有关实现此目标的最佳方法的意见。以下列表描述了可用于更改属性 A 值的三种方法:

  1. 主类通过直接调用属性,在请求对象的每个子对象上显式设置属性 A 的值。例如,Request.Object1.PropertyA = newValue;

  2. 在 Request 类中创建一个方法来更新每个子对象上的 Property A 的值,例如 UpdatePropertyA()

  3. 在创建 Request 类的实例时,传递一个构建器类,该类负责创建一个新的 Request 实例,包括创建每个使用 DI 的四个对象。 builder 类包含一个属性,例如 Property A,然后用于为 Request 类的每个子对象设置 name 属性的值。

很高兴听到想法。谢谢。

最佳答案

您建议的前两种方法的问题是它们不灵活。如果稍后您的需求发生变化(比如您将有更多的子对象,或者属性 A 将被简单地重命名等),这将导致主类或 Resource 类发生变化,这是不好的。此外,在我看来,这不是这些类更新属性 A 的工作。

我个人建议稍微修改一下第三种方法,因为它将所有更新逻辑都移到了构建器对象中,这是一种很好且灵活的解决方案。我会说这个对象应该有一个方法,比如说 BuildUp(Request instance),并且在这个方法中所有的更新都应该发生。你实现实际更新的方式在这里并不重要——它都将被放在一个特殊的类中,如果有任何变化,它可以在眨眼之间被修改,而无需改变应用程序类的主要逻辑.

此外,您可能希望为该构建器创建一个接口(interface),并且仅在 Resource 类的代码中使用该接口(interface)进行操作。主类将了解正在使用的构建器的实际实现。这样,在发生任何更改的情况下,只需一行代码即可替换构建器的实现。

关于c# - 使用 Builder 类通过 DI 重新创建子对象集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7786768/

相关文章:

c# - 如何比较列表并有效地获得最频繁的对?

django - Django 中的 models 和 models.Model 之间有什么区别?(对于 forms 和 forms.Form 也类似)

c++ - 在另一个类中调用一个类函数(非静态成员函数的无效使用)

c# - Ninject 的 .NET MVC3 服务定位器/依赖解析器问题

c# - 始终从 GAC 获取最新的 dll

c# - 数据 GridView 中的多行列。使用 C#

c# - 不要使用 'System.Runtime.CompilerServices.DynamicAttribute' 。请改用 'dynamic' 关键字

c++ - 每个窗口的 Win32 api 不同类?

dependency-injection - 控制域对象构造问题的反转

dependency-injection - 依赖注入(inject) - 谁拥有接口(interface)?