0

Ninject Event Broker拡張機能を使用しており、2つのサービスがあります。ServiceOneイベントの発行者です。ServiceTwoサブスクライバーです。ServiceOneに強い依存関係はありませんServiceTwo。DependencyCreation拡張機能を使用して依存関係を作成しています。

要件は次のとおりです。

  • これら2つのオブジェクト間で1対1のイベントを定義したいと思います。ServiceTwoDependencyCreationによって作成されたインスタンスのみがイベントを受信する必要があります。
  • ServiceTwoオブジェクトグラフのさらに下に他のインスタンスがある場合、それらはイベントを受信しないはずです。(これは当てはまらないはずですが、私はそれを説明したいと思います)
  • ServiceTwo廃棄時に廃棄する必要がありますServiceOne
  • これはWebアプリケーションであり、の有効期間はServiceOne1つのリクエストのみである必要があります。

基本的に、私は自分が書いている動作を再現しようとしています。

var publisher = new Publisher();
var subscriber = new Subscriber();
var subscriber2 = new Subscriber();
publisher.MyEvent += subscriber.MyEventHandler;

1つの出版社。1人の加入者。Subscriber2はイベントを取得しません。

これが私のコードです:

this.Bind<IServiceOne, ServiceOne>().To<ServiceOne>().Named("ServiceOne").OwnsEventBroker("ServiceOne").RegisterOnEventBroker("ServiceOne");
this.Kernel.DefineDependency<IServiceOne, IServiceTwo>();
this.Bind<IServiceTwo>().To<ServiceTwo>().WhenParentNamed("ServiceOne").InDependencyCreatorScope().RegisterOnEventBroker("ServiceOne");

2つの質問。

これは私の要件を満たしていますか?もっと良い方法はありますか?

4

1 に答える 1

0

私は通常、自分の質問に答えるのは好きではありませんが、これがしばらく静かだったので、コードサンプルをテストしていて、正常に動作しているように見えます。これらの依存関係の作成とイベントブローカー登録プロセス全体をクリーンアップするために、いくつかの拡張メソッドを作成しました。まずIsPublisher、スコープ付きイベントブローカーを作成する拡張機能を使用します。

    public static ISubscriberBuildingSyntax IsPublisher<TPublisher>(this IBindingWhenInNamedWithOrOnSyntax<TPublisher> syntax)
    {
        string name = Guid.NewGuid().ToString();
        syntax.Named(name);
        syntax.OwnsEventBroker(name).RegisterOnEventBroker(name);
        return new SubscriberBuildingSyntax<TPublisher>(syntax, name);
    }

CreateSubscriberDependency次に、 DependencyCreatorを使用して依存関係を作成するジェネリックメソッド:

    public ISubscriberBuildingSyntax CreateSubscriberDependency<TSubscriber>() where TSubscriber : class
    {
        this.syntax.Kernel.DefineDependency<TPublisher, TSubscriber>();
        this.syntax.Kernel.Bind<TSubscriber>().ToSelf().WhenParentNamed(this.name).InDependencyCreatorScope().RegisterOnEventBroker(this.name);
        return this;
    }

私はこれを次のように呼ぶことができます:

     this.Bind<IRegistrationService>().To<RegistrationService>()
            .IsPublisher()
            .CreateSubscriberDependency<RoleService>();

これにより、の存続期間に関連付けられRegistrationServiceた依存関係を持つインスタンスをスコープとするイベントブローカーが作成されます。RoleServiceRegistrationService

次に、に登録RegistrationServiceInRequestScopeて、これを1つのリクエストの有効期間に制限できます。

于 2013-03-20T09:38:27.317 に答える