2015-09-28 42 views
0

在我工作的公司中,我们正在开发从各种客户(其他公司)使用的应用程序。应用程序的核心是相同的,但是当涉及到一些细节时,每个客户都有自己的需求。如何在取决于客户的应用程序中选择策略

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

我的问题是,有没有办法知道哪个策略实施注入取决于正在使用应用程序的客户,而不避免“案件”或“如果elses”?

如何在实际应用中实现它?

public IStrategy GetStrategy(string customerName) { 
    switch(customerName) { 
     case "customer1": 
      return new Strategy1(); 
     case "customer2": 
      return new Strategy2(); 
    } 
} 

编辑: 由于这个问题(Strategy Pattern with no 'switch' statements?)建议的接受的答案,“战略不是魔抗交换机解决方案。”

还有其他意见吗?

+0

你有每个客户或通用的策略类型的客户可以从中选择一个自定义的策略类型? – guillaume31

+0

在大多数情况下,每个客户都有一个策略。 – Khronos

+0

关于你的编辑 - 接受的答案是非常真实的,但与你的问题没有多大关系。交换机和策略是关于决策的。您的问题与决策标准('“customer1”')的决策结果('Strategy1')匹配。有几十种技术手段可以实现这一点:配置文件中的键和值,数据库中的表,内存中的字典结构,客户名称的REST资源,您的名称。 – guillaume31

回答

1

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

How to use Activator.CreateInstance (MSDN)

Activator.CreateInstance Example

+0

用这种方法,我将不得不知道我想要使用什么策略。工厂存在的原因是根据客户创建策略。 – Khronos

+1

@Khronos除了每个客户之外,您还可以在数据库的配置表中存储策略类型。 – guillaume31

+0

将这些信息保存在数据库中对我来说没有多大意义。通过查看代码,不可能知道每个客户使用哪种策略。 – Khronos

相关问题