几个域驱动器设计问题



最近我正在努力学习DDD,我正在做一个测试项目。关于我的代码,我有几个问题。我只想澄清一下,这个代码片段中Event的含义指的是音乐会、会议等。它与DomainEvents、委派或类似的东西无关:

public class EventsDomainService : IEventsDomainService
{
private readonly IEventFactory _eventFactory;
private readonly IEventsRepository _eventsRepository;
public EventsDomainService(IEventsRepository eventsRepository, IEventFactory eventFactory)
{
_eventFactory = eventFactory;
_eventsRepository = eventsRepository;
}
public async Task<Event> CreateEvent(Guid id, string name, DateTime startsAt, short durationHrs, Guid organizerId, Guid venueId, byte minAge, EventType type, bool isAvailable)
{
var @event = _eventFactory
.Builder(id, name, new Organizer(organizerId), new Venue(venueId), startsAt, type)
.WithDuration(durationHrs)
.WithMinAge(minAge)
.WithIsAvailable(isAvailable)
.Build();
await _eventsRepository.Insert(@event);
return @event;
}
}
  • 回购接口是域的一部分,但具体实现在基础结构层。这是正确的方法吗?

  • 创建事件是现实生活领域的一部分,所以我理解DDD,创建事件是领域服务的责任。我说得对吗?我想知道,因为它只打电话给工厂,而且一直存在。它应该在应用程序服务中吗?或者应该使用构造函数来代替替换服务的方法,并调用存储库?

  • 正如您在工厂中看到的,事件聚合具有Organizer实体。我需要一个只有Id的Organizer实体对象吗?或者我可以只使用Guid字段吗。所以,如果组织者是一个更复杂的实体,例如它有一个名称,我应该如何处理它?

提前感谢。

回购接口是域的一部分,但具体实现在基础结构层。这是正确的方法吗?

纠正

创建事件是现实生活领域的一部分,所以据我所知,DDD的创建事件是领域服务的责任。我说得对吗?我想知道,因为它只打电话给工厂,而且一直存在。它应该在应用程序服务中吗?或者应该使用构造函数来代替替换服务的方法,并调用存储库?

您混淆了创建构建事件。这就是为什么我更喜欢说域层引发事件,基础结构层实例化它们(就像工厂一样(。与前面的问题一样,考虑域层中的IEventsDomainService和基础结构层中的EventsDomainService。在接口中,域层提供事件的值。在实现中,您可以将它们持久化到事件源持久化机制中,将它们发送到MQ服务以进行CQRS处理,或者如果需要,可以将它们发布到twitter。

您也可以从工厂看到,事件聚合有一个Organizer实体。我需要一个只有Id的Organizer实体对象吗?或者我可以只使用Guid字段吗。所以,如果组织者是一个更复杂的实体,例如它有一个名称,我应该如何处理它?

事件是域状态的更改。它不是状态本身,因此事件本身不能是聚合。将事件作为ORM映射对象存储在与聚合相同的RDBMS中不是设计约束。例如,您可以在不持久化它们的情况下将它们发送到MQ,并且仍然将聚合持久化在ORM访问的RDBMS中。

将事件实施视为一个基础设施问题。如果使用事件源,您将有一个存储库从事件中重建聚合状态,但这就像从一系列增量补丁中恢复文件内容:从写优化的物理模型中返回业务价值。

最新更新