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>();
}