锁定老帖子 主题:什么是.NET Attribute
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2004-09-08
.NET attribute是什么东西呢?简单说,你可以定义一个自己的custom attribute class,这是一个普通的class(拿咱们的话来说叫POJO),在里面啥都可以做。那干吗不把这个class定义成一个真正的普通class,或者干脆就一堆static方法呢?那是因为,custom attribute class可以得到一些与众不同的输入。那么这些输入是从哪里来的?就是从attribute annotation这里来的。attribute annotation提供了什么信息?是关于被标注(annotate)的那个class或者method的、针对编译单元的信息。关于编译单元的信息,你叫它什么?我就把它叫做元数据(metadada)。所以.NET attribute就是一个元数据标注,不多也不少。就算你吹出大天来,它也变不成别的什么东西。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2004-09-08
Dotnet attribute从开始的第一天起就是为了弥补OOP的不足, 通过横向定义的方法来影响对象(如class, method, )等元素的行为, attribute programming已成为dotnet framework的一个重要部份, 下面是几个他的应用,
1 用在transaction management http://www.codeproject.com/dotnet/declarativetransactions.asp 2 用在security management中 http://msdn.microsoft.com/security/securecode/dotnet/default.aspx?pull=/library/en-us/dnnetsec/html/aptcatypes.asp 3 用在Data Access Object中 http://www.donxml.com/FunwithAttributeBasedProgramming.htm 4 用在web service中 http://www.oreilly.com/catalog/prognetws/chapter/ch02.html 基本上, 作为declarative programing在DotNet的主要手段, attribute已被广泛使用 |
|
返回顶楼 | |
发表时间:2004-09-08
我不用看也知道这些文章里写什么。事务管理是吧,在Java里面我们写:
/** * @spring.transaction * level="READONLY" **/ public User getEmployeeById(Long id); { 在.NET里面我们写: [Transaction(TransactionOption.Required);] sealed public class Employees : ContextBoundObject { [AutoComplete] public EmployeeDataSet GetEmployeeById(intnID); Web Service是吧?在EJB 3.0里面我们写: @webService public String helloWorld(); { 在C#里面我们写: [WebMethod] public string HelloWorld(); { 你说这是不是同一回事?你说这个annotation不是metadata又是什么?既然是处理annotation的class,custom annotation class不是metadata工具又是什么?真正处理事务或者web service的,难道不是后面的另一个框架,倒是custom annotation class本身了?要是不用attribute,难道你就想不出别的地方去放这些metadata了?有了attribute,难道你就一定得绑死在这么一种实现方式上面? |
|
返回顶楼 | |
发表时间:2004-09-08
如果我把
[WebMethod] public string HelloWorld() { 改为 [EnterpriseMethod] public string HelloWorld() { 这个HelloWorld就不是web service了, 而是indigo Enterprise message了. 所以当我把我的web service转为下一代通信标准indigo时, 我只需改attribute就可以了, 而这个是通过WebMethodAttribute class或EnterpriseMethodAttribute class中的代码来实现的 |
|
返回顶楼 | |
发表时间:2004-09-08
多新鲜啊,元数据不就是拿来干这个的吗?你要是把@hibernate.class的annotation去掉,这个class还不会被当作持久对象了呢。那这说明什么呢?说明annotation记录了这个class本身之外的一些信息(究竟通过web service还是别的什么东西发布它)。这种“class本身之外的信息”,你说不叫元数据还该叫什么?“meta-”这个前缀不就是表达的这个意思吗?
而且,这个信息就只能放在attribute里面吗?我拿个XML文件、或者干脆就是properties文件来说“这个class通过web service发布”,行不行?不还是同一回事吗?唯一不同的就是处理这个元数据的不是attribute class,而是一个别的对象,真正负责发布web service的那个框架对这个元数据从哪里来不还是一无所知吗? |
|
返回顶楼 | |
发表时间:2004-09-08
是没啥特殊的, 我只是觉的方便好用, 不需要到处找XML, 编程序无非如此。 不是非得带一堆高深的理论才行
|
|
返回顶楼 | |
发表时间:2004-09-08
关键是元数据能否通过某种机制自动类的行为产生影响,而不是通过另外的厂来构造.如日志属性,new 的对象的方法调用会自动写日志,说白了,有一个内置于语言的隐含厂.
|
|
返回顶楼 | |
发表时间:2004-09-08
agilecat 写道 关键是元数据能否通过某种机制自动类的行为产生影响,而不是通过另外的厂来构造.如日志属性,new 的对象的方法调用会自动写日志,说白了,有一个内置于语言的隐含厂.
你觉得把这种feature内置在语言里很好?我倒觉得耦合太强了。很明显这个问题我只要用动态代理就可以解决,干吗要在语言里给我加上这些不必要的玩意?我需要倒也罢了,如果我不需要,岂不是还要为这些附加的复杂度买单? |
|
返回顶楼 | |
发表时间:2004-09-08
不是觉得的很好,只是觉得能否提供一个选择,当然默认不应该支持,打开一个开关,就支持了.
|
|
返回顶楼 | |
发表时间:2004-09-08
幸好.NET attribute没有aop的动态功能强大,必须要从新编译,否则这将是一个致命的隐患.太可怕了,看来ms总是不能改掉一些臭习惯阿.
|
|
返回顶楼 | |