0

我的问题是关于Udi对域事件的解决方案,尤其是类DomainEvents(参见下面的代码)

摘自 Udi 的代码。它以静态类的形式存在域模型。

public static class DomainEvents
{ 
   [ThreadStatic] //so that each thread has its own callbacks
   private static List<Delegate> actions;

   public static IContainer Container { get; set; } //as before

   //Registers a callback for the given domain event
   public static void Register<T>(Action<T> callback) where T : IDomainEvent
   {
      if (actions == null)
         actions = new List<Delegate>();

      actions.Add(callback);
  }

  //Clears callbacks passed to Register on the current thread
  public static void ClearCallbacks ()
  { 
      actions = null;
  }

  //Raises the given domain event
  public static void Raise<T>(T args) where T : IDomainEvent
  {
     if (Container != null)
        foreach(var handler in Container.ResolveAll<Handles<T>>())
           handler.Handle(args);

     if (actions != null)
         foreach (var action in actions)
             if (action is Action<T>)
                 ((Action<T>)action)(args);
  }
} 

从上面的代码中,静态成员IContainer在域模型中创建了一个 ioc-container-dependency。虽然我不确定 UdiIContainer是接口还是实际的 IoC 容器。

我在他的样本中看不到这样的东西:

public interface IContainer
{
    IEnumerable<T> ResolveAll<T>();
}

我的第一个问题是:课堂上这是IContainer什么DomainEvents如果它真的是一个 IoC 容器,那它不是打破了“在域中没有基础设施”的规则吗?(如果我错了请纠正我)

DDD 的想法不就是将基础设施与域分离吗?

我的第二个问题是:DomainEvents本身是否违反了“DDD 无处不在的语言”的规则?因为它的实现不属于任何领域。

4

1 回答 1

3

我同意,域一定不知道基础设施,并且在一定程度上,Udi 的解决方案提供了这种抽象。就个人而言,我更喜欢 Mark Seemann 在文章评论中暗示的解决方案:通过接口注入事件聚合器。这样,事件作为一等域模型公民保持在那里,但通过最松散的耦合。

于 2013-12-27T10:10:47.063 回答