8

Caliburn.Microのドキュメントでは、著者はそのような可能性について言及しています。

ドキュメントリンク

IHandleは、マーカーインターフェイスIHandleから継承します。これにより、キャストを使用して、オブジェクトインスタンスがイベントにサブスクライブしているかどうかを判断できます。これにより、IoCコンテナと統合する場合に、簡単な自動サブスクライブが可能になります。ほとんどのIoCコンテナ(SimpleContainerを含む)は、新しいインスタンスが作成されたときに呼び出されるためのフックを提供します。コンテナのコー​​ルバックに接続し、作成中のインスタンスを調べてIHandleが実装されているかどうかを確認し、実装されている場合は、イベントアグリゲータでSubscribeを呼び出します。

Autofacでこれをどのように達成することができますか?

デコレータの機能を利用してみましたが、もちろんこの場合はちょっと不適切です。さらに、デフォルトでは、IHandle<>の実装者はコンテナ内のIHandleのインスタンスとして登録されていません。

PS何か役に立つかもしれない場合に備えて、この不適切な実装を提供することは疑わしいですが。

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

2 に答える 2

15

Caliburnがどのように機能するかについていくつかの仮定を立てると、あなたが探しているのは次のとおりです。

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

モジュールが実装されている場所は次のとおりです。

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);
            };
        }
    }
}
于 2011-07-29T09:55:07.737 に答える
0

これは古い投稿ですが、メモを追加するだけだと思いました。

Autofacのコンストラクターを使用して、ハンドラーを挿入できます。

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

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

于 2017-01-13T15:04:44.437 に答える