2010-04-04 2 views
2

Я пытаюсь реализовать nhibernate transaction handling через Interceptors и не мог понять, как зарегистрировать интерфейс через свободный механизм.Зарегистрировать перехватчик с замком Свободный интерфейс

Я вижу

Component.For<ServicesInterceptor>().Interceptors 

, но не знаете, как использовать его. Кто-нибудь может мне помочь? This example казался немного сложным.

ответ

6

Вы делаете это в два этапа:

  • Вы должны зарегистрировать перехватчик в качестве службы в контейнере:
container.Register(Component.For<MyInterceptor>()); 
  • вы регистрируете компонент, который вы хотите перехватить. Использование Interceptors метода на беглом API необходимо указать, какие из зарегистрированных перехватчиков (по ключу или типа), вы хотите, чтобы перехватить этот компонент с:
container.Register(Component.For<IFoo>().ImplementedBy<Foo>() 
    .Interceptors<MyInterceptor>()); 

См the documentation для более подробной информации.

+0

@Krzysztof Мой перехватчик предназначен для выбора всех методов и проверки пользовательского атрибута. Это означает, что класс может не реализовывать интерфейс. По существу, любой метод, имеющий атрибут транзакции, входит в транзакцию. Итак, как добавить перехватчик для перехвата всех методов в домене приложения? Ваш пример, если для 'IFoo' –

+0

DynamicProxy способен перехватывать вызовы методам в классах, но требование состоит в том, чтобы эти методы были виртуальными, так как ваши компоненты удовлетворяют этому требованию, вам хорошо идти –

+1

@QuintinPar 7 лет позже ... Чтобы перехватить каждый созданный компонент, используйте примеры IContributeComponentModelConstruction http://stackoverflow.com/a/26426700/90033 и https://github.com/castleproject/Windsor/blob/master/docs/componentmodel-construction-contributors .md – Konstantin

1

Первый зарегистрировать перехватчик:

container.Register(Component.For<IDbInterceptor>().ImplementedBy<DbInterceptor>().Named("transactionInterceptor"));

затем зарегистрировать возражающего быть перехвачены:

.

container.Register (Component.For < IMyService>() ImplementedBy < MyService>(). Именованные («MyService»). Перехватчики (новый InterceptorReference ("transactionInter рецептор ")) в любом месте).

Смежные вопросы