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并在之前执行验证的工厂?
谢谢你的帮助!
我会使用某种形式的反转控制.
具体来说,我会有一个名为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)
显然,在运行时,您可以传递任何您想要的验证器实例.
| 归档时间: |
|
| 查看次数: |
3162 次 |
| 最近记录: |