我正在组建一个新系统,我想拥有一个丰富的域名。但是,我想要了解一些我想了解更多的细节。
假设我有一个Customer类,你在哪里实际持有客户实体或聚合root?
应该是具有持久性知识的客户类吗?
var myCustomer = CustomerFactory.CreateCustomer(id);
myCustomer.Name = ...
myCustomer.LastName = ...
myCustomer.Save()
在这种情况下,我需要将我的客户存储库传递给客户类(通过工厂或一些注入)。请注意,我在Eric Evens的DDD书中找不到一个很好的例子。
另一种方法是让客户不了解持久性
var myCustomer = CustomerFactory.CreateCustomer(id);
myCustomer.Name = ...
myCustomer.LastName = ...
CustomerRepository repository = new CustomerRepository();
repository.Save(myCustomer);
另外我想我可以有一个服务类,它可以像这样一起完成:
AddCustomerService service = new AddCustomerService(CustomerRepository repository)
service.AddCustomer(myCustomer);
只是一点点说明: 如果我实际上没有保存在客户类中,我发现我的客户类只是属性,可能只是稍微验证,但仅此而已。没有真正的行为。行为被移动到服务类或客户端使用的存储库......
答案 0 :(得分:2)
后者是优选的。也就是说,在CustomerRepository类中编写save方法。在DDD中,实体应该不了解持久性逻辑。您的域实体通常不包含行为,并且只包含属性(尽管有时它们应包含两者)。
答案 1 :(得分:1)
我有一个DDD项目。这个顺序有4层(因为我没有使用WCF,否则会有更多):
1. UI
1.1 MVC4.csproj
... (Repository Interfaces)
... (Repository Implementations)
2. Service Layer
2.1 Service.cs
...DTOs
3. Business Layer
3.1 DomainObjects.csproj
4. Data Access Layer
4.1 DAL.csproj (Entity framework 5)
... (Repository Interfaces)
... (Repository Implementations