域事件(Udi样式)并尝试解决服务层模式

时间:2013-10-18 15:29:53

标签: entity-framework domain-driven-design autofac factory-pattern domain-events

关于我有一个使用AutoFac,CommonServiceLocator和Udi的域事件(http://www.udidahan.com/2009/06/14/domain-events-salvation/)的工作解决方案,这是一个微妙的问题。 我让Autofac在MVC引导程序中设置ServiceProvider。但有两件事令我烦恼: 1)域事件是通过使用CommonServiceLocator的静态方法引发的。这使得单元测试变得困难,并且它还隐藏了一些我喜欢使用的Autofac功能。这导致我...... 2)我的事件由IEventSubsriber使用,其中T是DomainEvent。但情况是我喜欢在一个活动上有几个订阅者。这意味着我在举办活动时会收到几个订阅者。

 IEnumerable<IEventSubscriber<T>> registeredHandlers =
                    ServiceLocator.Current.GetAllInstances<IEventSubscriber<T>>();

但是我已经通过AutoFac用MetaData标记了这个订阅者实例:

   builder.RegisterType<CreateNewRevisionEvent>().AsImplementedInterfaces()
                   .WithMetadata<EventSubsriberMetadata>(x => x.For(order => order.Order, 1));

和MetaData类是:

public class EventSubsriberMetadata
    {
        public int Order { get; set; }
    }

所以问题。我想实现我可以以某种方式使用抽象工厂(不解决1)只是将问题转移到另一个地方),AutoFac Delegate Factory(Func&lt;&gt;对Generics不满意)或者只是简单明了注入DomainEventDispatcher?

杀死我的是我想避免在Domain.Core程序集中依赖。我知道我今天依赖于CommonServiceLocator。但是在基本实体类上使用DI(它产生的结果)我不知道任何简单的方法。我已经看过Nicklas Blumhardt的演示,其中AutoFac通过NHibernate拦截器将DomainEventDispatcher注入实体,并且可以在Up / Down期间将事件调度为持久性。整洁的解决方案。 但是我使用Entity Framework 5,我也希望有一个更简单的解决方案。

期待看到一些答案或至少讨论这个话题。我想很多人在遇到这个问题时都会停下来。也许只是 - &#34;好吧我们只使用CSL用于事件&#34;它们也为单元测试制定了界限。 - &#34;我们跳过事件的单元测试&#34;。 这不是问题:))

/最好的问候Magnus

1 个答案:

答案 0 :(得分:0)

您的任务归结为将域代码与Autofac,CommonServiceLocator等依赖项分离。这是一件好事。也就是说,嵌入域代码中的服务定位器(域事件注册表和引发)并没有任何内在错误。你只需要降低可发现性就可以了。还有其他方法可以实现类似的目标(例如Plain .net事件,IObservable实体,......)。 订阅应该从外部进行。例如,作为创建子生命周期范围的一部分。

要考虑的另一件事是应该触发事件。如果你有一点点延迟,你可以让实体在内部收集他们的域事件,并在操作结束时向实体询问他们收集的域事件,然后将它们分发给订户。请注意最后一部分如何在应用程序层中或至少在域代码之外发生。很大程度上取决于您在活动订阅者中尝试实现的目标。

因此,解耦当然是可能的,但它需要验证针对您的要求采取的策略。实验:))