Caching 用于缓存的AOP x IoC

Caching 用于缓存的AOP x IoC,caching,inversion-of-control,aop,Caching,Inversion Of Control,Aop,您更喜欢在方法(任何DAO或服务方法)之上的AOP缓存层的干净方法,还是更喜欢在需要时注入缓存实例的总控制方法 我理解AOP为您提供了松散耦合和关注点分离,但没有那么大的灵活性,除非您自己编写方法拦截器 我倾向于喜欢IoC方法,因为如果需要,缓存实例可以很容易地模拟,并且通过缓存实例,您可以完全控制和灵活地进行模拟 这就像日志记录。谁实际使用AOP进行应用程序范围的日志记录?这是一个关于我们是否应该使用“真正的”AOP的问题(我所说的“真正的”是指量化和遗忘,这样您就可以在全局范围内为系统启用方

您更喜欢在方法(任何DAO或服务方法)之上的AOP缓存层的干净方法,还是更喜欢在需要时注入缓存实例的总控制方法

我理解AOP为您提供了松散耦合和关注点分离,但没有那么大的灵活性,除非您自己编写方法拦截器

我倾向于喜欢IoC方法,因为如果需要,缓存实例可以很容易地模拟,并且通过缓存实例,您可以完全控制和灵活地进行模拟


这就像日志记录。谁实际使用AOP进行应用程序范围的日志记录?

这是一个关于我们是否应该使用“真正的”AOP的问题(我所说的“真正的”是指量化和遗忘,这样您就可以在全局范围内为系统启用方面,并且100%透明)。我的意见是,尽量避免使用100%透明的解决方案。如果您处于开发阶段,那么最好以不强迫您在中间代码级别执行AOP编织之类的技巧的方式设计您的系统

另一方面,为您需要的每个组件/接口编写缓存关注点将非常令人不安,无论您将如何做。我想到的最明显的方法是为每个缓存的类都有一个缓存装饰器类——一件事做了很多次


因此,我将尝试遵循的路径是使用一些基于动态代理的IoC扩展来实现AOP。当从IoC获取对象时,如果缓存应用于给定类型,容器可以检入其配置,如果是,则创建一个基于接口的带缓存的动态代理。此解决方案不会强迫您编写大量类似的代码,并且由于其在源代码中的可见性,它比“真实”AOP更容易混淆。有一些类似的实现,但您尚未指定任何语言,因此我无法提供任何语言。

Unity IOC容器可以通过不同类型的方法拦截器支持AOP。签出MSDN。