c# - 通过 IoC 影响带有属性的 AOP;代码味还是优雅?

标签 c# .net inversion-of-control structuremap aop

目前我正在使用 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/

相关文章:

java - Autowiring 在 Spring 4 中不起作用

c# - Mootools Scriptmanager Ajax Asp.net 冲突?

c# - 将两个列表相交并返回与原始第一个字符串值的保留顺序的相似度

c# - 是否可以使用 Mono AOT 编译( native )c# 可执行文件和具有未实现 Mono 方法的 C# Dll(CIL)

.net - Aero 是否操纵 DPI 和屏幕尺寸?为什么?

c# - 如何注销匿名处理程序?

c# - 如何避免依赖注入(inject)构造函数的疯狂?

c# - 使用 DI 将参数传递给 DbContext

c# - 哪个更好,什么时候: using statement or calling Dispose() on an IDisposable in C#?

inversion-of-control - 哪些 IOC 容器可与 Windows Azure 配合使用