当前,我的聚合和值对象具有受保护的构造函数,并且几乎所有它们都是由聚合内部具有描述性名称的静态工厂方法创建的。它创建了一个不错的 DSL 和漂亮的封装模型,但使单元测试很痛苦(如果域模型创建失败,那么服务/命令处理程序也会被标记为失败) 。另一方面,为每个实体引入工厂方法,而值对象迫使我将每个实体/值对象的工厂接口注入服务。
可以通过每个实体/值对象的工厂方法为每个聚合根创建工厂服务吗? 这是一个工厂服务的示例,该工厂创建公司聚合根及其内部实体/ VO:
public class CompanyFactory : ICompanyAggregateRootFactory
{
public Company CreateCompany(...){}
public Employee CreateEmployee(...){}
public CEO CreateCEO(...){}
....
}
是否还有其他方法可以实现相同级别的封装和 DSL 透明性,而无需使单元测试相互依赖?
答案 0 :(得分:0)
蓝皮书中有一章是关于工厂的。是的,完全可以为聚合根创建工厂。该工厂的内部实现并不重要。您可以将其他工厂用于值对象或任何其他方式。 我有一个建议:我对您的域名不了解很多,但我认为员工应该是一个单独的集合。而且CEO实际上是员工,所以也许您应该重新考虑这种设计。