使用Builder类使用DI重新创建子对象集

本文关键字:创建 对象 新创建 Builder DI 使用 | 更新日期: 2023-09-27 18:11:29

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

Request类是从项目的主类实例化的。主类大约每30秒调用一次RetrieveResource()。在每次调用之后,可能需要调整Request类的子对象中的一个或多个子对象的属性a。

我很想听听大家对实现这一目标的最佳方法的看法。下面的列表描述了可以用来改变属性A值的三种方法:

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

  2. 在Request类中创建一个方法来更新每个子对象的属性a的值,例如:UpdatePropertyA()

  3. 当创建Request类的实例时,传递一个负责创建新的Request实例的构建器类,包括使用DI创建四个对象中的每个对象。构建器类包含一个属性,例如,属性a,然后用于为Request类的每个子对象设置名称的属性值。

感激听到的想法。谢谢。

使用Builder类使用DI重新创建子对象集

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

我个人建议稍微修改第三种方法,因为它将所有更新逻辑移动到构建器对象,这是一个很好的和灵活的解决方案。我会说这个对象应该有一个方法,比如BuildUp(Request instance),所有的更新都应该在这个方法中进行。您实现实际更新的方式在这里并不重要-它将全部留在一个特殊的类中,并且在任何更改的情况下,它可以在眨眼之间进行修改,而不改变应用程序类的主逻辑。

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