gpt4 book ai didi

c# - 如何使用 DDD/CQRS 编写功能

转载 作者:太空狗 更新时间:2023-10-29 21:23:47 24 4
gpt4 key购买 nike

我有一个如下所列的银行帐户域。可以有 SavingsAccount、LoanAccount、FixedAccount 等。一个用户可以拥有多个账户。我需要添加一个新功能——获取用户的所有帐户。函数应该写在哪里,怎么写?

如果解决方案遵循 SOLID 原则(开闭原则,...)和 DDD,那就太好了。

欢迎任何能让代码变得更好的重构。

注意:网站客户端将通过 Web 服务使用 AccountManipulator。

namespace BankAccountBL
{
public class AccountManipulator
{
//Whether it should beprivate or public?
private IAccount acc;

public AccountManipulator(int accountNumber)
{
acc = AccountFactory.GetAccount(accountNumber);
}

public void FreezeAccount()
{
acc.Freeze();
}

}

public interface IAccount
{
void Freeze();
}

public class AccountFactory
{
public static IAccount GetAccount(int accountNumber)
{
return new SavingsAccount(accountNumber);
}
}

public class SavingsAccount : IAccount
{
public SavingsAccount(int accountNumber)
{

}

public void Freeze()
{

}
}
}

阅读:

  1. When to use the CQRS design pattern?

  2. In domain-driven design, would it be a violation of DDD to put calls to other objects' repostiories in a domain object?

  3. Refactoring domain logic that accesses repositories in a legacy system

  4. Which of these examples represent correct use of DDD?

  5. Good Domain Driven Design samples

  6. Advantage of creating a generic repository vs. specific repository for each object?

最佳答案

如果您的 AccountManipulator 是您域的 Façade,我不会将帐号放入构造函数中。我会这样重构它:

public class AccountManipulator
{
private AccountFactory _factory;
private UserRepository _users;

public AccountManipulator(AccountFactory factory, UserRepository users)
{
_factory = factory;
_users = users;
}

public void FreezeAccount(int accountNumber)
{
var acc = _factory.GetAccount(accountNumber);
acc.Freeze();
}

public IEnumerable<IAccount> GetAccountsOf(User user) {
return _users.GetAccountIds(user).Select(_factory.GetAccount);
}
}

public interface UserRepository {
IEnumerable<int> GetAccountIds(User user);
}

为了说明你的域名是否是SOLID,你应该用以下原则来分析它:

  • 单一职责:每个对象都有自己的职责(而且只有那个):
    • AccountFactory:创建 IAccounts
    • SavingsAccount:读取/写入(数据库?网络服务?)的 IAccount 的实现
    • AccountManipulator:提供一组最小且简单的操作来处理域对象。
  • 开放/封闭:您的类(class)是否对扩展开放而对更改关闭?
    • AccountFactory:嗯,不。如果您编写了 IAccount 的新实现,为了使用它,您必须更改 AccountFactory。解决方案:抽象工厂
    • 储蓄账户?这取决于它是否会使用外部依赖项。需要更多代码。
    • AccountManipulator:是的。如果您需要对您的域对象进行其他操作,您可以直接使用其他服务而无需更改 AccountManipulator。或者你可以继承它
  • Liskov 替换:你能用另一个实现替换任何类吗?需要更多的代码来说明。您现在没有 IAccount 或 IAccountFactory 的其他实现
  • 依赖倒置:
    • AccountManipulator 应该依赖于抽象:AccountFactory 和 UserRepository 应该是接口(interface)。

关于c# - 如何使用 DDD/CQRS 编写功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11095361/

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