【问题标题】:Implementing .Net DI Compile Time Proxies?实现.Net DI 编译时代理?
【发布时间】:2017-09-25 17:10:22
【问题描述】:

我并不是在寻求一个具体的实现,而是试图找出我正在尝试做的事情的适当术语,以便我可以正确地研究这个主题。

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

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

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

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

类似:

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

显然这行不通,因为我只能使用泛型来概括方法的类型,而不能概括方法本身。我可以使用一些棘手的反射方法来做到这一点吗?

【问题讨论】:

  • 不确定你想做什么,我知道你知道,但是你可以在运行时使用反射来创建代理。 NHibernate 和 EF 做到了,它使延迟加载和其他功能成为可能。见this post。对于审计,我喜欢使用 NHibernate 的 Listeners,这是一个非常有用的功能 :)
  • 你考虑过动态拦截吗? app-code.net/wordpress/?p=689
  • @DavidOsborne - 这两个似乎都是我(含糊)问题的好答案。如果您添加它们,我很乐意为您的时间投票。
  • @FelipeOriani - 这两个似乎都是我(含糊)问题的好答案。如果您添加它们,我很乐意为您的时间投票。

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


【解决方案1】:

您正在寻找温莎城堡所谓的拦截器。这是处理cross-cutting concernsaspect-oriented 方式——审计当然是其中之一。 See documentation,或an article about the approach

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

如果您想将其应用于许多已注册的服务,请阅读有关 interceptor selection mechanisms 的更多信息:IModelInterceptorsSelector 帮助。

使用PostSharp,这样的事情甚至可以在编译时完成。这可以加速生成的应用程序,但如果使用得当,interceptors are not slow

【讨论】:

  • 谢谢!这是我一直在寻找的信息。这些术语和文章将帮助我进一步研究。
猜你喜欢
  • 2013-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
  • 2020-11-26
相关资源
最近更新 更多