gpt4 book ai didi

architecture - 编程模式/架构问题

转载 作者:行者123 更新时间:2023-12-04 03:59:28 25 4
gpt4 key购买 nike

我目前正在从事一个项目,在该项目中,我有一个其他实体的 BankAccount 实体。

每个银行账户作为对银行实体、帐号和可选的 IBAN 的引用。

现在,由于可以验证 IBAN,我如何确保为帐户设置 IBAN 时有效。什么是干净的架构方法?我目前有一个域层,没有任何其他层的引用,我喜欢这种干净的方法(我受到 Eric Evans DDD 的启发)。幸运的是,可以在不访问任何外部系统的情况下执行 IBAN 验证,所以在这种情况下,我可以有类似的东西

puclic class BankAccount
{
public string Iban
{
set { // validation logic here }
}
}

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

谢谢你的帮助!

最佳答案

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

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

interface IBANValidator {
Boolean Validate(string iban);
}

class SqlBanValidator : IBANValidator {

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

}

然后,我将在我的 BankAccount 类中有一个方法,该方法接受一个实现 IIBANValidator 和 IBAN 号码的对象,其结构类似于(未通过任何拉伸(stretch)优化):
Boolean SetIBAN(IIBANValidator validator, String iban) {
Boolean result = false;
if (validator.Validate(iban)) {
Iban = iban;
result = true;
}

return result;
}

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

最终代码如下所示:
BankAccount account = new BankAccount();
account.SetIBAN(new SqlBanValidator(), "my iban code");

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

关于architecture - 编程模式/架构问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2006472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com