Caliburn.Micro. Автоматически вызывать eventaggregator.Subscribe () для разработчиков IHandle с Autofac - PullRequest
8 голосов
/ 29 июля 2011

В Caliburn.Micro документации авторы упоминают такую ​​возможность:

ссылка на документацию

IHandle наследуется от интерфейса маркера IHandle,Это позволяет использовать приведение, чтобы определить, подписывается ли экземпляр объекта на какие-либо события.Это обеспечивает простую автоматическую подписку, если вы интегрируетесь с контейнером IoC.Большинство контейнеров IoC (включая SimpleContainer) предоставляют ловушку для вызова при создании нового экземпляра.Просто подключитесь к обратному вызову вашего контейнера, осмотрите создаваемый экземпляр, чтобы узнать, реализует ли он IHandle, и, если это так, вызовите Subscribe для агрегатора событий.

Как этого можно достичь с помощью Autofac?

Я пытался использовать возможности decorator , но, конечно, это не подходит для этого случая.Более того, по умолчанию мои разработчики 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");

Ответы [ 2 ]

15 голосов
/ 29 июля 2011

Делая несколько предположений о том, как работает 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);
            };
        }
    }
}
0 голосов
/ 13 января 2017

Это старый пост, но я подумал, что просто добавлю к нему заметку.

Вы можете использовать конструктор в Autofac для внедрения обработчиков:

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

Хотя вышеприведенное не является базовым классом EventAggregator из Caliburn.Micro, вы можете создать его подкласс или изменитьисходный код для предоставления собственного конструктора для EventAggregator.

...