Управление жизненным циклом с помощью Ninject Dependency Creator и Event Broker

Я использую Ninject в достаточно большом проекте и хочу использовать Расширения Dependency Creation и Event Broker.

В файле сведений о создании зависимостей приводится следующий пример (хотя я считаю, что InCreatorScope теперь, возможно, переименован в InDependencyCreatorScope)

this.kernel.Bind<IParent>().To<Parent>();
this.kernel.DefineDependency<IParent, Dependency>();
this.kernel.Bind<Dependency>().ToSelf().InCreatorScope();

В этом примере создается зависимость через контейнер между Parent и Dependency без "жесткой" ссылки друг на друга. Это способствует слабой связи между компонентами и позволяет мне использовать Event Broker для публикации события в Parent и подписки на него в Dependency без явного подключения обработчика событий.

Мой вопрос таков: что, если Dependency внедряется в другие объекты, и я хочу, чтобы у него было время жизни RequestScope для стандартных активаций? Как указать, что я хочу использовать область запроса для стандартных активаций, но область создателя зависимостей при создании вместе с Parent?


person Matt B    schedule 15.01.2013    source источник


Ответы (1)


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

// dedine dependency as before
this.kernel.Bind<Dependency>().ToSelf().When(r => r.Parameters.OfType<DependencyCreationParameter>().Any()).InDependencyCreatorScope();
this.kernel.Bind<Dependency>().ToSelf().When(r => !r.Parameters.OfType<DependencyCreationParameter>().Any()).InRequestScope();

Но обычно, когда у вас есть решение на основе брокера событий, вы можете просто зарегистрировать созданные объекты с перегрузкой OnActivation в брокере событий, что упрощает создание сложных областей.

person Daniel Marbach    schedule 16.01.2013
comment
Привет, Даниэль, спасибо, я хотел сделать что-то подобное. Что я действительно хочу сделать, так это убедиться, что между моим издателем и подписчиком существует связь один к одному. У меня было запущено несколько обработчиков подписки, и я не мог понять, как обеспечить, чтобы область действия брокера событий находилась только между Родителем и Зависимостью, а не какими-либо другими объектами Зависимости, которые могут быть внедрены ниже в графе объектов. - person Matt B; 16.01.2013