Можно ли использовать внедрение зависимостей с обработчиками событий Umbraco 7 ContentService?

Я использую Umbraco 7.1.1 с проектом MVC и настроил его для использования внедрения зависимостей (Castle.Windsor в моем случае). Я также использую NServiceBus для отправки сообщений и т. д., и он работает очень хорошо.

Теперь я пытаюсь подключиться к событию ContentService Published, чтобы попытаться опубликовать событие NServiceBus, чтобы предупредить другие службы об изменении содержимого. Я хотел бы сделать что-то вроде этого:

public class ContentPublishedEventHandler : ApplicationEventHandler
{
    public IBus Bus { get; set; }

    public ContentPublishedEventHandler()
    {
        ContentService.Published += ContentServiceOnPublished;
    }

    private void ContentServiceOnPublished(IPublishingStrategy sender, PublishEventArgs<IContent> publishEventArgs)
    {
        Bus.Publish<ContentUpdatedEvent>(e =>
        {
            e.UpdatedNodeIds = publishEventArgs.PublishedEntities.Select(c => c.Id);
        });
    }
}

Но в этом случае Bus имеет значение null, поскольку моя структура внедрения зависимостей либо неправильно настроена, либо (как я подозреваю) никогда не вызывается.

Я могу заставить его работать, если полагаюсь на статическую ссылку на шину, но я бы предпочел избежать этого, если смогу. Возможно ли то, что я пытаюсь сделать? Т.е. использовать внедрение зависимостей с этими событиями Umbraco? Если да, то какая конфигурация мне нужна, чтобы Umbraco использовала Castle.Windsor для создания моего обработчика событий?


person thecodefish    schedule 04.06.2014    source источник


Ответы (1)


если вы все еще ищете ответ, было бы лучше внедрить зависимость в конструктор ContentPublishedEventHandler, чтобы код выглядел так:

public class ContentPublishedEventHandler : ApplicationEventHandler
{
    public IBus Bus { get; set; }
    
    public ContentPublishedEventHandler(IBus bus)
    {
        Bus = bus;
    }

    protected override void ApplicationStarting(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
    {
        ContentService.Published += ContentServiceOnPublished;

        base.ApplicationStarting(umbracoApplication, applicationContext);
    }
        
    
    private void ContentServiceOnPublished(IPublishingStrategy sender, PublishEventArgs<IContent> publishEventArgs)
    {
        Bus.Publish<ContentUpdatedEvent>(e =>
        {
            e.UpdatedNodeIds = publishEventArgs.PublishedEntities.Select(c => c.Id);
        });
    }
}

Если вам нужна дополнительная информация об использовании внедрения зависимостей с Umbraco 7, обратитесь к https://web.archive.org/web/20160325201135/http://www.wearesicc.com/getting-started-with-umbraco-7-and-structuremap-v3/

person Pawel Bres    schedule 26.03.2015