实现.Net DI编译时间代理?

时间:2017-09-25 17:10:22

标签: nhibernate dependency-injection castle-windsor proxy-classes

我不是在寻求具体的实施,而是试图找出我试图做的正确的术语,以便我能够正确地研究这个主题。

我有一堆接口,这些接口由控制器,存储库,服务和诸如此类的东西实现。在应用程序启动过程的某个地方,我们使用Castle.MicroKernel.Registration.Component类来注册用于特定接口的类。例如:

Component.For<IPaginationService>().ImplementedBy<PaginationService>().LifeStyle.Transient

最近,我开始对创建每个类和方法调用的审计跟踪感兴趣。这些类中有几百个,所以手工编写每个类的代理类并不是很实用。我可以使用模板来生成代码,但我不想用所有这些来夸大我们的代码库。

所以我很好奇是否有某种即时解决方案。我知道nHibernate在某些点创建代理类,覆盖所有实体类。有人可以给我一些关于如何在这里做类似事情的指导吗?

类似的东西:

Component.For<IPaginationService>().ImplementedBy<ProxyFor<PaginationService>>().LifeStyle.Transient

显然,它不会起作用,因为我只能使用泛型来概括方法的类型而不是方法本身。我可以使用一些棘手的反思方法吗?

1 个答案:

答案 0 :(得分:1)

您正在寻找Castle Windsor所谓的拦截器。这是aspect-oriented解决cross-cutting concerns问题的方法 - 审核无疑是其中之一。 See documentationan article about the approach

  

面向方面编程是一种在现有操作之前或之后有效“注入”代码片段的方法。这可以通过定义一个Inteceptor包装被调用的逻辑然后注册它来在每次调用特定的方法集/子集时运行。

如果您想将其应用于许多已注册的服务,请详细了解interceptor selection mechanismsIModelInterceptorsSelector有帮助。

使用PostSharp,这样的事情甚至可以在编译时完成。这可以加快生成的应用程序,但正确使用后,interceptors are not slow