目前我正在使用 StructureMap
,通常使用基于约定的 (Scan()
) 自动配置,我希望添加基于装饰器的缓存到管道中。
如果我手动配置它没问题,但是 Scan()
非常方便,当你有很多依赖项时......我在玩 noting cache关于界面的建议,例如:
public interface IFoo {
[CacheDuration(20)] // cache for 20 minutes
string[] DoSomethingReusable();
SomeType DoSomethingNonReusable(int key); // not cached
}
想法是通过向 StructureMap
的扫描添加自定义“约定”(非常简单),它可以发现一个或多个方法被装饰用于缓存,并自动注入(inject)一个生成缓存装饰器到该类型的管道中(从接口(interface)/方法名称和参数值生成缓存键)。
从好的方面来说,它使添加缓存变得非常轻松——只需稍微装饰一下界面;但是代码有味道吗?和/或我是否在复制已经解决的问题?
最佳答案
如果您知道两个主要因素,属性就可以了:
本质上分散的结构,而不是在一个地方,您将元数据散布在它接触的每个组件上
严格的编译器常量结构。如果你突然决定你的缓存持续时间应该是 10,而不是 20,你必须重新编译你所有的代码。您可以将属性路由到诸如配置之类的东西,但这是围绕属性工作的,此时您真的应该重新考虑使用它们是否首先是最好的主意。
只要您意识到这些问题,并且接受它们,就可以继续。
关于c# - 通过 IoC 影响带有属性的 AOP;代码味还是优雅?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2235270/