Регистрация / использование перехватчиков Castle.Core.AsyncInterceptor - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь использовать пакет Castle.Core.AsyncInterceptor для обработки исключений, генерируемых асин c методами, но я пытаюсь понять, как связать все это вместе.

Мой предыдущий реализованный ExceptionInterceptor стандартный интерфейс IInterceptor, так что я мог бы применить перехватчик ко всем соответствующим классам, используя что-то вроде

  _container.Register(Classes.FromAssemblyContaining(typeof(BaseDao))
                            .BasedOn<BaseDao>()
                            .Configure(c => c.Interceptors<ExceptionInterceptor>()));

. Документы предлагают вместо этого реализовать IAsyncInterceptor, что я и сделал, но последняя строка в коде выше теперь понятно выдает мне ошибку компиляции (без неявного преобразования ссылки из ExceptionInterceptor в IInterceptor), потому что это больше не IInterceptor.

Вместо этого документы предлагают сделать это таким образом

var myClass = new ClasThatImplementsIMyInterface();
var generator = new ProxyGenerator();
var interceptor = new ClasThatImplementsIAsyncInterceptor();
IMyInterface proxy = generator.CreateInterfaceProxyWithTargetInterface<IMyInterface>(myClass,interceptor)

Но я не уверен, что делать после этого. Нужно ли создавать прокси для каждого из моих DAO, а затем регистрировать их индивидуально в контейнере, прежде чем я смогу их использовать? Я изо всех сил пытаюсь понять, как это будет работать.

Спасибо

1 Ответ

0 голосов
/ 24 января 2020

Я добавлю ответ, который у меня есть, так как он в некоторой степени отвечает на мой вопрос, хотя требует некоторой работы, чтобы сделать его более обобщенным c. Я понятия не имею, как применить этот шаблон к каждому DAO в сборке, но, по крайней мере, он работает для одного класса. Я просто должен повторить это для каждого класса, к которому я хочу добавить перехватчик.

_container.Register(
          Component.For<IGroceryDao>()
              .UsingFactoryMethod(() => ServiceFactory.BuildGroceryDao(_container.Resolve<IDbTransaction>()))
              .LifestyleScoped());

Он использует фабричный метод в ServiceFactory (просто класс, который я создал, который содержит метод ниже), чтобы создать DAO с прокси-сервером, к которому применен перехватчик:

public static IGroceryDao BuildGroceryDao(IDbTransaction transaction)
    {
      return (IGroceryDao) new ProxyGenerator()
                                .CreateInterfaceProxyWithTargetInterface<IGroceryDao>(new Neo4jGroceryDao(transaction), new ExceptionInterceptor());
    }

Объект транзакции - это то, что уже зарегистрировано в контейнере, в котором нуждается DAO, поэтому я просто разрешаю его и передаю его фабричному методу.

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

...