0

AutoFac、CommonServiceLocator、および Udi のドメイン イベント ( http://www.udidahan.com/2009/06/14/domain-events-salvation/ ) を使用した実用的なソリューションがあるという事実に関して、微妙な問題があります。Autofac に MVC ブートストラップで ServiceProvider を設定させました。しかし、私を悩ませていることが 2 つあります。1) ドメイン イベントは、CommonServiceLocator を使用する静的メソッドを介して発生します。これにより、単体テストが難しくなり、また、私が好んで使用する Autofac 機能のいくつかが隠されます。これにより、... 2) 私のイベントは、T が DomainEvent である IEventSubsriber によって消費されます。しかし、シナリオとしては、1 つのイベントに複数のサブスクライバーがいるのが好きです。つまり、イベントを発生させると、複数のサブスクライバーを取得できます。

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

しかし、AutoFac を使用して、このサブスクライバー インスタンスにメタデータをタグ付けしました。

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

MetaData クラスは次のとおりです。

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

それで質問です。どうにかしてAbstract Factory(1を解決しないでください)を使用して、問題を別の場所に移動するだけです)、AutoFac Delegate Factory(Func <> Genericsにはあまり満足していません)、または単純な注入を実現したいと思いますDomainEventDispatcher に?

私を殺しているのは、Domain.Core アセンブリの依存関係を避けたいということです。今日、私は CommonServiceLocator に依存していることを知っています。しかし、基本エンティティ クラスで DI を使用する (それがもたらすもの) 簡単な方法はわかりません。AutoFac が NHibernate Interceptors を介して DomainEventDispatcher をエンティティに挿入し、Up/Down 中にイベントをディスパッチして永続化できる Nicklas Blumhardt のデモを見たことがあります。きちんとした解決策。しかし、私は Entity Framework 5 を使用しており、より簡単な解決策を望んでいます。

いくつかの答えを見るか、少なくともこのトピックについて話し合うことを楽しみにしています。この問題に近づくと立ち止まる人が多いと思います。そしておそらく - 「OK、イベントのためだけにCSLを使用します」とユニットテストの境界も作ります。- 「イベントの単体テストをスキップします」。それはここでは問題ではありません:)

/よろしくマグナス

4

1 に答える 1