我正在使用域驱动设计将大型经典ASP Web应用程序转换为ASP.Net MVC。虽然我的很多域名都适合DDD,但我仍然遇到纯DDD方法不合适的情况。例如,我的应用程序的读取方面与写入方面有很大不同。没问题,我创建了一个单独的读取模型,并实现了CQRS的简化版本(没有事件源,没有单独的数据库)。另一个问题是批量数据库操作。没问题,即作为服务实施。这是我目前的困境。我们的系统允许用户对系统进行更改,这些更改将来会有效。为了适应这种情况,我们有一个数据库表,用于存储生效日期之前的待定更改。在生效日期,自动化任务运行并执行实际的数据库更新。更新任务可以包括域逻辑,因此该部分适合DDD并且不是问题。为了帮助可视化正在发生的事情,这里是处理挂起更新的类:
public class PendingChanges
{
public int EntityID {get; set;}
public string FromTable {get; set;}
public string DetailField {get; set;}
public string NewValue {get; set;}
public DateTime EffectiveDate {get; set;}
public DateTime EnteredDate {get; set;}
public int UserID {get; set;}
public string UserName {get; set;}
public string UserArea { get; set; }
// Business logic and validation here?
}
正如您所看到的,这是一个可以处理各种数据库表更新的泛型类。它基本上存储了正在更新的数据库列,列的新值,它所属的表,生效日期和一些日志数据。
以下是我的问题:收集待处理更新并将其存储在待处理更新表中的逻辑是应该建模为域对象还是应该以其他方式处理,例如作为服务?
换句话说,PendingChanges本身就是一个拥有自己域逻辑的域实体?有些业务规则适用于PendingChanges,与发生更改的实体不同。例如,构成UserArea的内容可以被视为业务规则,因为它是FromTable的合法值,更不用说验证了。
或者PendingChanges是一个值对象,因为它可以跨不同的域对象重用?如果是这种情况,使用PendingUpdatesService更有意义吗?
答案 0 :(得分:2)
域的一部分是进行数据库更新的概念,即您是否正在构建数据库管理/报告软件?如果PendingChanges对您的域有意义,那么可能是一个实体,虽然这种技术性较少,但正确的域建模更为重要。如果PendingChanges是您的应用程序用于更新(域)数据库中的内容的类,则它与DDD或您的域无关。它是您基础架构的一部分。虽然仍然需要良好的OOP,但这里没有DDD流行语。
顺便说一句,如果一个对象有一个id,它通常是一个实体。