Autofac: расширение публикации/подписки

Поддерживает ли Autofac простой в использовании брокер сообщений для обмена сообщениями о событиях публикации/подписки «многие ко многим»?

Редактировать:

public class Service1
{
    [Publish("message://an-event")]
    public event Event<EventParams> AnEvent;

    public void DoSomething()
    {
        // do something
        // [...]

        // publish message
        if (AnEvent != null)
            AnEvent(this, new EventParams(something))
    }
}

public class Service2
{
    [Subscribe("message://an-event")]
    public OnAnEvent(object sender, EventParams eventParams)
    {
        Console.WriteLine("Hello World from Service2")
    }
}

public class Service3
{
    [Subscribe("message://an-event")]
    public OnAnEvent(object sender, EventParams eventParams)
    {
        Console.WriteLine("Hello World from Service3")
    }
}

Самое классное в расширении брокера сообщений Ninjects — его простота. Вам нужно только добавить аннотации к событиям, которые что-то публикуют, и методам, которые подписываются на это событие. Контейнер автоматически обрабатывает соединение. Вам останется только привязать сервисы.

Есть ли у autofac что-то подобное? Если нет, то как лучше всего сделать что-то подобное с помощью autofac?


person user1022465    schedule 03.02.2013    source источник
comment
Что вы подразумеваете под «поддержкой» (это «как я могу это сделать» или «есть ли готовое к использованию расширение»)? Что вы подразумеваете под «простым в использовании»?   -  person Pavel Gatilov    schedule 03.02.2013
comment
Под простотой в использовании я подразумеваю в первую очередь готовое к использованию расширение, подобное тем, которые предоставляет ninject.   -  person user1022465    schedule 03.02.2013
comment
Пожалуйста, разместите ссылку на страницу, которая показывает то, что вы хотите, или вставьте фрагмент кода. Для того, кто не знает Ninject, довольно сложно угадать, чего вы хотите.   -  person Pavel Gatilov    schedule 03.02.2013


Ответы (3)


Autofac в настоящее время не поставляется из коробки с какой-либо конкретной поддержкой брокера сообщений. Autofac является контейнером IoC, а не брокером сообщений, и если что-то нужно будет добавить, то это будут расширения, поддерживающие внешнюю систему как работает bbeventbroker от Ninject — возможна помощь в подключении обработки событий, но не в управлении фактическим брокерством правильный. (Точно так же, как Autofac не делает свои собственные реализации MVC или WCF — только помощники для взаимодействия с существующими системами.)

Вы можете выполнить собственную интеграцию с такой системой, как брокер событий bbvcommon или NServiceBus с использованием таких вещей, как постоянные события Autofac и/или пользовательские источники регистрации но как именно это нужно сделать и как это будет выглядеть, будет зависеть от системы, с которой вы интегрируетесь. Вы можете просмотреть исходный код других компонентов интеграции, чтобы получить идеи и шаблоны.

Если у вас действительно что-то работает, вы можете подумать о том, чтобы внести его для включения в качестве проекта Autofac.Extras.

person Travis Illig    schedule 05.02.2013
comment
использование NServiceBus кажется мне кувалдой, чтобы расколоть орех для моих целей, но bbvcommon EventBroker выглядит маленьким и простым в использовании. - person user1022465; 06.02.2013
comment
Я не давал рекомендаций по использованию конкретных брокеров, просто использовал их в качестве примеров. Есть и другие, я уверен. Вам предстоит оценить свои возможности и определить, что лучше для вас. - person Travis Illig; 06.02.2013

Предположим, вам нужно что-то вроде https://github.com/ninject/ninject.extensions.weakeventmessagebroker, ответ, безусловно, «Да». На самом деле, я не понимаю, почему реализация брокера сообщений должна быть привязана к контейнеру IoC. Это полностью независимые компоненты с совершенно отдельными задачами. Вы можете выбрать любую реализацию брокера сообщений и зарегистрировать ее в любом контейнере IoC.

Вы даже можете выбрать ninject.extensions.weakeventmessagebroker и зарегистрировать его в Autofac следующим образом:

builder.RegisterType<EventReflectionStrategy>().As<IPlanningStrategy>();
builder.RegisterType<EventBindingStrategy>().As<IActivationStrategy>();
builder.RegisterType<WeakEventMessageBroker>().As<IWeakEventMessageBroker>()
       .SingleInstance();

а затем добавьте IWeakEventMessageBroker в качестве зависимости к типу, чтобы использовать его. Хотя я сам не пробовал.

Может быть, это не так уж и готово к использованию, но все же очень просто.

Обновить

Я отредактировал пример кода, чтобы превратить брокера в синглтон, который должен работать должным образом.

person Pavel Gatilov    schedule 03.02.2013

Архитектура брокера сообщений сама по себе не привязана к используемому вами контейнеру. Взгляните на эту статью, где приведены некоторые примеры брокеров сообщений .NET, в том числе на основе Rx. .

person Dmitri Nesteruk    schedule 30.06.2013