没有第三方工具可以学习面向方面编程的任何好资源

时间:2011-08-12 07:34:32

标签: aop custom-attributes

我看到.NET从1.0增长到4.0。但有一个问题一直困扰着我。类中的属性如何允许类的对象的某些行为发生变化?

我的意思是,如果你看一下WCF,当你在它上面添加一些属性时,该服务对象的整个行为就会改变。是否有某种处理程序收集该请求以调用该对象或其方法,并使用该相同的实例来处理一些额外的信息。

我知道有一些第三方工具,比如城堡或N-Hibernate用于此任务,但是如何在.NET中完成它而不使用它。我想知道它背后的真正交易是制作我自己的自定义逻辑来处理类或其方法或属性的某些对象的属性处理。

非常欢迎任何正确方向的帮助。

感谢。 MB。

1 个答案:

答案 0 :(得分:0)

嗯,你所要求的并不一定与面向方面编程有关。相反,AOP框架通常使用属性来标记所谓的“切入点”,即。应用“建议”的地方(即,类型将被修改的地方)。

通常情况下,改变班级行为的不是属性本身;他们只是“标记”某种类型的特殊待遇,例如:通过另一个框架,库,字节码重写器等......或者只是由.NET本身。

  • 有一些特殊属性是.NET的一个本质部分,它们“修改”一种类型,甚至不需要任何其他工具 - 它们将被.NET的执行环境区别对待。 MarshalByRefObjectAttribute可能就是其中之一。 SerializableAttribute是另一个对.NET BCL处理序列化很重要的部分。

  • Visual Studio的Windows窗体设计器会查找某些属性,例如BrowsableDescription等。

  • WCF会查找属性,例如OperationContractDataContract等。

这里要理解的要点是,有人(即使它本身就是.NET)必须主动检查属性的存在和做某些事情;他们自己不做任何事!它们只是注释了其他内容的数据。

您可以编写自己的组件来获取对象,并查看对象的类型是否具有在其上定义的属性(如果是,则以不同的方式继续)。这可以通过反思来完成:

using System.Linq;
using System.Reflection;
…

public class SomeAttribute : Attribute { … }

void DoSomethingWith<T>(T someObject) // (T is only introduced here for
{                                     // easy reference in the comments below.)
    object[] attribute = 
          someObject.GetType().GetCustomAttributes(typeof(SomeAttribute), true);

    if (attribute.Any())
    {
        // [SomeAttribute] is present on type T, or T inherits the attribute.
    }
    else
    {
        // [SomeAttribute] is not present on T.
    }
}

另请参阅MSDN上的文档:System.Type.GetCustomAttributes