C# 如何根据客户选择应用程序中的策略

C# 如何根据客户选择应用程序中的策略,c#,domain-driven-design,strategy-pattern,C#,Domain Driven Design,Strategy Pattern,在我为之工作的公司,我们正在开发一个应用程序,该应用程序由不同的客户(其他公司)使用。应用程序的核心是相同的,但是当涉及到一些细节时,每个客户都有自己的需求 我认为解决这个问题的方法是通过向需要使用它的组件注入适当的策略来实现策略模式 我的问题是,有没有一种方法可以根据使用该应用程序的客户来知道应该注入哪种策略实现,而不必避免“案例”或“如果其他情况” 您将如何在实际应用程序中实现它 public IStrategy GetStrategy(string customerName) {

在我为之工作的公司,我们正在开发一个应用程序,该应用程序由不同的客户(其他公司)使用。应用程序的核心是相同的,但是当涉及到一些细节时,每个客户都有自己的需求

我认为解决这个问题的方法是通过向需要使用它的组件注入适当的策略来实现策略模式

我的问题是,有没有一种方法可以根据使用该应用程序的客户来知道应该注入哪种策略实现,而不必避免“案例”或“如果其他情况”

您将如何在实际应用程序中实现它

public IStrategy GetStrategy(string customerName) {
    switch(customerName) {
        case "customer1":
            return new Strategy1();
        case "customer2":
            return new Strategy2();
    }
}
编辑: 正如这个问题的公认答案()所暗示的,“战略不是一个神奇的反切换解决方案。”


关于这一点还有其他意见吗?

传递strategyName参数而不是customerName怎么样?我的意思是,若您从数据库中检索customerName,那个么为strategy name添加一列(它必须是strategy类名)。然后,使用该strategyName调用GetStrategy方法,并使用Activator.CreateInstance方法创建策略类实例


您是否为每位客户提供了一种自定义策略类型,或客户可以选择的通用策略类型?在大多数情况下,每位客户都有一种策略。关于您的编辑,公认的答案是非常正确的,但与您的问题无关。转换和策略与决策有关。您的问题是将决策标准(
“customer1”
)的值与决策结果(
策略1
)匹配。有几十种技术手段可以做到这一点:配置文件中的键和值、数据库中的表、内存中的字典结构、按客户名称命名的REST资源,通信不应该硬编码,而是在一个易于修改的地方(配置文件、数据库)指定。使用这种方法,我必须知道我想要使用什么策略。工厂存在的原因是根据客户创建策略。@Khronos您可以将每个客户之外的策略类型存储在数据库的配置表中。将此信息保存在数据库中对我来说没有多大意义。仅仅通过查看代码就不可能知道每个客户使用哪种策略。我认为这种类型的数据不应该出现在代码中。因为,X客户今天可以使用策略1,但明天可能会使用策略2。在这种情况下,您必须重建代码并部署它。如果你使用我的建议,你只需要更新数据库。阿门。不要硬编码那些每天都可能改变的事情。