我正在为我正在开发的会计系统遵循DDD方法。
有两个部分(见下面的域):
我的域是这样的:
public class AccountingTransaction : AggregateRoot
{
public string AccountingTransactionId { get; private set; }
public TransactionStatus TransactionStatus { get; private set; } //enum
private List<CashTransaction> _cashTransactions = new List<CashTransaction>();
public IReadOnlyList<CashTransaction> CashTransactions => new ReadOnlyCollection<CashTransaction>(_cashTransactions);
private List<LedgerTransaction> _ledgerTransactions = new List<LedgerTransaction>();
public IReadOnlyList<LedgerTransaction> LedgerTransactions => new ReadOnlyCollection<LedgerTransaction>(_ledgerTransactions);
private AccountingTransaction(string transactionId, List<CashTransaction> cashTransactions, List<LedgerTransaction> ledgerTransactions, TransactionStatus transactionStatus)
{
//Code omitted for brevity
}
public static IResult<AccountingTransaction> CreateTransaction(string transactionId, List<CashTransaction> cashTransactions, List<LedgerTransaction> ledgerTransactions, List<ClientAccount> clientAccounts, List<Ledger> ledgerAccounts)
{
//Factory method
//Maintain invaraint and creates a new transaction
}
public IResult CancelTransaction(string username)
{
}
}
public class LedgerTransaction
{
public int Id { get; private set; }
public string LedgerAccountId { get; private set; }
public string TransactionId { get; private set; }
public string EntryDescription { get; private set; }
public DateTime? ReconciledOn { get; private set; }
public TransactionAmount TransactionAmount { get; private set; } //Value object
private LedgerTransaction(int id, TransactionAmount transactionAmount,
string transactionId,
string entryDescription,
string batchId,
string ledgerAccountId)
{
//Code omitted for brevity
}
internal static IResult<LedgerTransaction> CreateTransaction(/*List of arguments*/)
{
//Factory method
//Code omitted for brevity
}
}
public class CashTransaction
{
public int Id { get; private set; }
public string ClientAccountId { get; private set; }
public string TransactionId { get; private set; }
public TransactionAmount TransactionAmount { get; private set; }//Value object
public string EntryDescription { get; private set; }
private CashTransaction(int id,
TransactionAmount transactionAmount,
string transactionId,
string entryDescription,
string clientAccountId)
{
Id = id;
TransactionAmount = transactionAmount;
TransactionId = transactionId;
EntryDescription = entryDescription;
ClientAccountId = clientAccountId;
}
internal static IResult<CashTransaction> CreateTransaction(/*List of arguments*/)
{
//Factory method
//Code omitted for brevity
}
}
public class Ledger : AggregateRoot
{
public string AccountId { get; private set; }
public string Name { get; private set; }
public LedgerType LedgerType { get; set; }
public Currency Currency { get; private set; }
}因此,第一部分(创建事务)工作得很好,而且我还停留在如何处理Ledger帐户对账上。
问题:为了调节帐户,在给定的一天内,我需要获取属于特定分类账的所有分类账事务,其中ReconciledOn(参见域类)为空。然后,我需要确保所有借方和贷方总数为0-如果不是,我需要报告错误。匹配的借方和贷方也有可能属于不同的集合根(AccountingTransaction)。这也意味着我需要在聚合根(AccountingTransaction)之外获取Ledger事务,这是针对DDD的,然后可能直接对LedgerTransactions表执行写操作。
请告诉我该如何处理这个问题。域类中有缺陷吗?
谢谢你的帮助。
谢谢!
发布于 2021-04-12 13:42:07
乍一看,这个领域看起来不错。这里有几个选择:
AccountingTransaction,并将它们全部传递给对账服务。这将要求您将一些域逻辑放到存储库中(了解什么是不可调和的事务),但这应该是可以的。LedgerTransaction成为它自己的聚合根。发布于 2021-04-05 23:34:16
这种冲突意味着LedgerTransaction想要成为一个聚合根。
https://stackoverflow.com/questions/66953844
复制相似问题