C# 打破",;“无处不在的语言”;通过在域模型中使用IoC?

C# 打破",;“无处不在的语言”;通过在域模型中使用IoC?,c#,domain-driven-design,ioc-container,onion-architecture,domain-events,C#,Domain Driven Design,Ioc Container,Onion Architecture,Domain Events,我的问题是关于域事件,特别是类DomainEvents(参见下面的代码) Udi代码的摘录。它以静态类的形式存在于域模型中 public static class DomainEvents { [ThreadStatic] //so that each thread has its own callbacks private static List<Delegate> actions; public static IContainer Container { g

我的问题是关于域事件,特别是类
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);
  }
} 
我的第一个问题是:
DomainEvents
类中,这个
IContainer
是什么?
如果它确实是一个IoC容器,那么它是否违反了“域中没有基础设施”的规则?(如果我错了,请纠正我)

DDD的理念不是要将基础设施与域分离吗


我的第二个问题是:域事件本身是否违反了“DDD的普遍语言”规则?因为它的实现不涉及任何领域。

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

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

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

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

但是
DomainEvents
类不被视为基础设施吗?特别是它有IContainer。请看我更新的问题。我认为DomainEvents类隐藏了它对基础结构类型组件的依赖。我不需要知道它正在使用Castle Windsor引发域事件。如果模型类只依赖于引发事件的接口,那么耦合可能会更松散。然而,我认为这两种方法都是有效的。但是
DomainEvents
类不被认为是一种基础设施吗?特别是它有IContainer。请看我更新的问题。我认为DomainEvents类隐藏了它对基础结构类型组件的依赖。我不需要知道它正在使用Castle Windsor引发域事件。如果模型类只依赖于引发事件的接口,那么耦合可能会更松散。然而,我认为这两种方法都是有效的。但是
DomainEvents
类不被认为是一种基础设施吗?特别是它有IContainer。请看我更新的问题。我认为DomainEvents类隐藏了它对基础结构类型组件的依赖。我不需要知道它正在使用Castle Windsor引发域事件。如果模型类只依赖于引发事件的接口,那么耦合可能会更松散。然而,我认为这两种方法都是有效的。但是
DomainEvents
类不被认为是一种基础设施吗?特别是它有IContainer。请看我更新的问题。我认为DomainEvents类隐藏了它对基础结构类型组件的依赖。我不需要知道它正在使用Castle Windsor引发域事件。如果模型类只依赖于引发事件的接口,那么耦合可能会更松散。但是,我认为这两种方法都是有效的
public interface IContainer
{
    IEnumerable<T> ResolveAll<T>();
}