2011-07-29 3 views
7

でIHandleの実装のためのeventaggregator.Subscribe()を呼び出します。Caliburn.Micro。自動的著者はそのような可能性に言及し<strong>Caliburn.Micro</strong>ドキュメントでAutofac

documentation link

IHandleはマーカーインターフェイスIHandleから継承します。これにより、オブジェクトインスタンスが任意のイベントにサブスクライブするかどうかをキャストすることができます。これにより、IoCコンテナと統合すると、簡単な自動購読が可能になります。ほとんどのIoCコンテナ(SimpleContainerを含む)は、新しいインスタンスが作成されたときに呼び出されるフックを提供します。コンテナのコー​​ルバックのために配線するだけで、IHandleが実装されているかどうかを確認するためにインスタンスが作成されているかどうか検査し、そうであれば、イベントアグリゲータでSubscribeを呼び出します。

これをAutofacでどのように実現できますか?

私はデコレータの機能を利用しようとしましたが、もちろんこの場合は不適切です。さらに、既定で私の実装者のIHandle <>は、IHandleのインスタンスとして登録されていません。

P.S.これを提供する不適切なの実装はちょっとしたことがあるかもしれませんが、私は疑いがあります。

builder.RegisterInstance<IEventAggregator>(new EventAggregator()); 
builder.RegisterDecorator<IHandle>((container, handler) => 
{ 
    var eventAggregator = container.Resolve<IEventAggregator>(); 
    eventAggregator.Subscribe(handler); 
    return handler; 
}, "unsubscribed", "subscribed"); 

答えて

13

カリバーンがどのように機能するかについていくつかの仮定を作り、私はあなたが探しているものだと思うことはある:

class AutoSubscribeHandersModule : Module 
{ 
    protected override AttachToComponentRegistration(
     IComponentRegistry registry, 
     IComponentRegistration registration) 
    { 
     if (typeof(IHandle).IsAssignableFrom(registration.Activator.LimitType)) 
     { 
      registration.Activated += (sender, e) => { 
       var aggregator = e.Context.Resolve<IEventAggregator>(); 
       aggregator.Subscribe((IHandle)e.Instance); 
      }; 
     } 
    } 
} 
+0

Doh、もう一度フィニッシュラインで殴られました! :) –

+0

本当に私の現在のニーズを満たす。ありがとう! – Alec

0

これは次のとおりです。モジュールのようなものが実装されている

builder.RegisterType<MyViewModel>(); 
builder.RegisterModule<AutoSubscribeHandlersModule>(); 

古い投稿ですが、私はちょうどメモを追加すると思っていました。

あなたはハンドラを注入するAutofacでコンストラクタを使用することができます

public MessageDispatcher(IEnumerable<IHandler> handlers) 
{ 
    foreach (var handler in handlers) 
     Subscribe(handler); 
} 

以上がCaliburn.MicroからEventAggregator基本クラスはありませんが、あなたはサブクラスにそれをすることができ、またはにソースコードを変更しますEventAggregator用の独自のコンストラクタを提供します。

関連する問題