1

我正在建立一个需要在某些市场上稍作改变的网站。例如,在英国市场,注册表单需要执行地址验证(已经可以使用),而在比利时站点上,我们需要使用 Web 服务验证人员(已经可以使用)。否则,注册功能基本相同。我们有这两个站点独立工作,但我们希望将它们合并到一个代码库中,该代码库可以支持基于配置的任一选项。

我最初的想法是使用配置值来表示“这是一个英国站点”或“这是一个比利时站点”,并根据此设置显示页面。

想法:

  • 基于配置动态加载控件的依赖注入
  • 工厂模式使用反射/激活器并根据配置动态加载
  • 通过设置标记名/标记前缀配置转换以加载不同的用户控件
  • 其他?

有人对我在哪里可以找到此类设计灵感的建议有任何初步想法吗?

4

2 回答 2

1

我会建议保持它尽可能简单和最小化。

只需创建类似的东西IPersonValidator,它有一个.Validate(PersonDetails)方法并返回一个错误数组。

编辑:

在配置方面,您可以创建以下结构的自定义配置部分:

<DomainSpecificSettings>
 <Key name="validator">
  <Value domain="www.yoursite.co.uk" value="firstValidator" />
  <Value domain="www.yoursite.de" value="secondsValidator" />
 </Key>
</DomainSpecificSettings> 

还有一件事——你不需要使用 Activator。你可以有一个单独的验证器存储,它为每个验证器类型保存一个实例,并且知道如何根据当前查看的市场的数据库配置设置找到正确的验证器:

ValidatorsStore.GetValidator(string configValue).Validate(PersonDetails).

这种情况下的设计可能很容易成为这种简单任务的过度杀伤力。我的方法是首先让它工作得足够好,然后才检查你是否需要让它更健壮。大多数情况下你不会。

于 2013-05-21T16:00:29.320 回答
1

首先,当您提到“加载用户控件”时,认为将实现的表示部分与逻辑/验证本身分开会更好。您可以创建(或细化)适用于所有国家/地区的通用用户控件,但调用逻辑以在英国的情况下进行地址验证,或者在 BE 的情况下不进行任何操作。MVC 世界中的单一职责原则或关注点分离。

还使用相同的原则将不同用户控件中页面的不同组件与其逻辑分开。在调用最终注册/注册之前,每个组件都有自己的验证。通过这种方式,您可以通知玩家输入数据中的验证错误,而无需提供完整的玩家信息来进行注册。一旦提供并验证了玩家的完整信息,您就可以调用将玩家保存在数据库中的注册。

关于 StrategyProvider 类来决定调用哪个逻辑,同意 Uri,我们将有很多地方的逻辑在国家之间有所不同。但这不是我们可以用 IoC 容器设置的东西吗?不太了解 IoC 容器,但如果逻辑是“静态的”(当您在网站上时,它不会根据请求而改变)可以在应用程序启动时设置它。

另一种可能性是使用 SOA 模式并根据您所在的网站调用不同的服务。(可以在配置中设置相同的服务端点)。不同国家的服务可以有不同的逻辑,但返回一个遵循通用接口的类(使用适配器模式)。

于 2013-05-23T16:26:36.747 回答