编程模式/架构问题

Chr*_*ris 4 architecture design-patterns domain-driven-design

我目前正在开发一个项目,其中我有一个其他实体的BankAccount实体.

每个银行帐户作为银行实体的参考,帐号和可选的IBAN.

现在,由于可以验证IBAN,如何确保为帐户设置IBAN时有效.什么是干净的建筑方法?我目前有一个域层,没有任何其他层的引用,我喜欢这种干净的方法(我的灵感来自Eric Evans DDD).幸运的是,可以在不访问任何外部系统的情况下执行IBAN验证,因此在这种情况下我可以使用类似的东西

puclic class BankAccount
{
  public string Iban
  {
     set { // validation logic here }
  }
}
Run Code Online (Sandbox Code Playgroud)

但是现在我在考虑如果IBAN验证需要SQL服务器检查,或者外部dll,我会使用什么方法.我该如何实现呢?我是否会创建一个传递给服务的IBAN值对象,该对象决定IBAN是否有效,然后将其设置为BankAccount实体?或者我会创建一个允许实施IBAN并在之前执行验证的工厂?

谢谢你的帮助!

Not*_*tMe 5

我会使用某种形式的反转控制.

具体来说,我会有一个名为IIBANValidator的接口.验证IBAN的各种方法应该实现该接口.例如:

interface IBANValidator {
    Boolean Validate(string iban);
}

class SqlBanValidator : IBANValidator {

    public bool Validate(string iban) {
        // make the sql call to validate..
        throw new NotImplementedException();
    }

}
Run Code Online (Sandbox Code Playgroud)

然后,我会在我的BankAccount类中有一个方法接受一个实现IIBANValidator和IBAN编号的对象,其结构类似(未经任何拉伸优化):

Boolean SetIBAN(IIBANValidator validator, String iban) {
  Boolean result = false;
  if (validator.Validate(iban)) {
    Iban = iban;
    result = true;
  }

  return result;
}
Run Code Online (Sandbox Code Playgroud)

此时,您的BankAccount类不必依赖于您的验证器,您可以随意交换它们,最终它非常干净.

最终的代码看起来像:

BankAccount account = new BankAccount();
account.SetIBAN(new SqlBanValidator(), "my iban code");
Run Code Online (Sandbox Code Playgroud)

显然,在运行时,您可以传递任何您想要的验证器实例.