注册/使用Castle.Core.AsyncInterceptor拦截器

时间:2020-01-23 10:09:23

标签: c# aop castle-windsor castle castle-dynamicproxy

我正在尝试使用Castle.Core.AsyncInterceptor包来处理从异步方法引发的异常,但是我正在努力了解如何将所有这些链接在一起。

我以前的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 :(得分:0)

我将添加到目前为止的答案,因为它确实在某种程度上回答了我的问题,尽管需要做一些工作才能使其更加通用。我不知道如何将这种模式应用于程序集中的每个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所需的容器中注册的东西,因此我只解决它,然后将其传递给工厂方法。

似乎仍然可以工作。如果有人可以建议如何使它更通用,那将是很棒的,但至少我认为这可以回答我所提出的问题。

相关问题