什么';在这个应用程序中,使用C#应用开闭原则最合适的方法是什么?

什么';在这个应用程序中,使用C#应用开闭原则最合适的方法是什么?,c#,architecture,open-closed-principle,C#,Architecture,Open Closed Principle,场景 每天晚上,我们对大约一百万份客户合同进行一系列计算。每个合同都与一组大约十种产品相关,每种产品都可能采用不同的计算方法(尽管总体流程基本相同)。给定产品的所有合同将在任何给定的夜晚使用相同的计算集;虽然从最小产品的几千到最大产品的几十万不等,但分布是不均匀的 随着时间的推移,我们将添加新的类似(但不太可能完全相同)产品,现有产品可能会通过引入所用算法的变化进行调整。(顺便说一句,我希望算法能够在不修改代码的情况下参数化地变化) 我们用来支持这一点的核心“引擎”应该适用于产品开发和生产。后者

场景

每天晚上,我们对大约一百万份客户合同进行一系列计算。每个合同都与一组大约十种产品相关,每种产品都可能采用不同的计算方法(尽管总体流程基本相同)。给定产品的所有合同将在任何给定的夜晚使用相同的计算集;虽然从最小产品的几千到最大产品的几十万不等,但分布是不均匀的

随着时间的推移,我们将添加新的类似(但不太可能完全相同)产品,现有产品可能会通过引入所用算法的变化进行调整。(顺便说一句,我希望算法能够在不修改代码的情况下参数化地变化)

我们用来支持这一点的核心“引擎”应该适用于产品开发和生产。后者由我们的运营人员管理,他们非常谨慎地对待自己接受的内容以及通常如何管理变革

在考虑架构时,我强烈地被以下因素所吸引:

软件实体应向用户开放 分机,但因故障关闭 修改

由于我们计划在C#中实现,我正在考虑规定在内核外部定义函数,以文本形式加载函数,并在产品运行开始时在产品定义的当前版本的控制下进行编译。这些组件中的每一个都将编译成一个类,该类实现应用程序的编译元素中定义的接口(或等效接口)。我乐观地认为,从运营的角度来看,这将被视为一个有利因素,因为回归测试的范围大大缩小了

问题

这有意义吗?有人能就潜在的陷阱提供一些明智的建议吗

我是否重新发明了依赖注入,是否会更好地建议我通过每次提供一个新的DLL来交付常规更改?如果是这样的话,这会使我们的日常产品开发过程变得更糟吗

或者我应该采取更灵活的方法,构建一个端到端的产品,然后依次添加其他产品,看看重构时会出现什么样的体系结构


如果您还和我在一起,感谢您的耐心…

使用依赖项注入来创建一个带有带IPProcess参数的process方法的类。为实现此接口的每个产品类型创建一个不同的类,每个类都应该位于其自己的DLL中。创建一个配置文件,将产品类型映射到进程dll和类。然后可以使用反射读取配置文件并加载相关DLL,然后将它们传递到DI类上的进程函数中。这样,只需创建一个新的DLL并更新配置文件,就可以添加一个新进程。更改现有进程只是更新相关类和重新部署dll的一个简单步骤。

使用依赖项注入创建一个带有带有IPProcess参数的进程方法的类。为实现此接口的每个产品类型创建一个不同的类,每个类都应该位于其自己的DLL中。创建一个配置文件,将产品类型映射到进程dll和类。然后可以使用反射读取配置文件并加载相关DLL,然后将它们传递到DI类上的进程函数中。这样,只需创建一个新的DLL并更新配置文件,就可以添加一个新进程。更改现有进程只是更新相关类和重新部署dll的一项简单工作。

+1@迈克-是的,你在重塑DI。使用接口将允许您实现打开/关闭。对于第一个端到端产品的接口,您仍然可以采用敏捷方法,但您需要相当快地完成它们;参见:稳定依赖原则和稳定抽象原则@迈克-是的,你在重塑DI。使用接口将允许您实现打开/关闭。对于第一个端到端产品的接口,您仍然可以采用敏捷方法,但您需要相当快地完成它们;参见:稳定依赖原则和稳定抽象原则。