Вы просите, чтобы это было в обоих направлениях.Вам либо нужно внедрить зависимость или инвертировать элемент управления и позволить другому объекту управлять взаимодействием между Aggregate и EventDispatcher.Я рекомендую сохранять ваши Агрегаты как можно более простыми, чтобы они не содержали зависимостей и оставались также тестируемыми.
Следующий пример кода очень прост и не будет тем, что вы вводите в производство, но иллюстрирует, как создавать агрегаты, свободные от зависимостей, без передачи списка событий вне контекста, в котором они нужны.
Если у вашего Агрегата есть список событий внутри него:
class MyAggregate
{
private List<IEvent> events = new List<IEvent>();
// ... Constructor and event sourcing?
public IEnumerable<IEvent> Events => events;
public string Name { get; private set; }
public void ChangeName(string name)
{
if (Name != name)
{
events.Add(new NameChanged(name);
}
}
}
Тогда у вас может быть обработчик, который выглядит следующим образом:
public class MyHandler
{
private Repository repository;
// ... Constructor and dependency injection
public void Handle(object id, ChangeName cmd)
{
var agg = repository.Load(id);
agg.ChangeName(cmd.Name);
repository.Save(agg);
}
}
И репозиторий, который выглядиткак:
class Repository
{
private EventDispatcher dispatcher;
// ... Constructor and dependency injection
public void Save(MyAggregate agg)
{
foreach (var e in agg.Events)
{
dispatcher.Dispatch(e);
}
}
}