论坛首页 编程语言技术论坛

什么是.NET Attribute

浏览 19113 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2004-09-08  
(我记得前几天有个.NET版的,怎么现在又找不着了呢?)

.NET attribute是什么东西呢?简单说,你可以定义一个自己的custom attribute class,这是一个普通的class(拿咱们的话来说叫POJO),在里面啥都可以做。那干吗不把这个class定义成一个真正的普通class,或者干脆就一堆static方法呢?那是因为,custom attribute class可以得到一些与众不同的输入。那么这些输入是从哪里来的?就是从attribute annotation这里来的。attribute annotation提供了什么信息?是关于被标注(annotate)的那个class或者method的、针对编译单元的信息。关于编译单元的信息,你叫它什么?我就把它叫做元数据(metadada)。所以.NET attribute就是一个元数据标注,不多也不少。就算你吹出大天来,它也变不成别的什么东西。
   发表时间: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已被广泛使用
0 请登录后投票
   发表时间: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,难道你就一定得绑死在这么一种实现方式上面?
0 请登录后投票
   发表时间: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中的代码来实现的
0 请登录后投票
   发表时间:2004-09-08  
多新鲜啊,元数据不就是拿来干这个的吗?你要是把@hibernate.class的annotation去掉,这个class还不会被当作持久对象了呢。那这说明什么呢?说明annotation记录了这个class本身之外的一些信息(究竟通过web service还是别的什么东西发布它)。这种“class本身之外的信息”,你说不叫元数据还该叫什么?“meta-”这个前缀不就是表达的这个意思吗?

而且,这个信息就只能放在attribute里面吗?我拿个XML文件、或者干脆就是properties文件来说“这个class通过web service发布”,行不行?不还是同一回事吗?唯一不同的就是处理这个元数据的不是attribute class,而是一个别的对象,真正负责发布web service的那个框架对这个元数据从哪里来不还是一无所知吗?
0 请登录后投票
   发表时间:2004-09-08  
是没啥特殊的, 我只是觉的方便好用, 不需要到处找XML, 编程序无非如此。 不是非得带一堆高深的理论才行
0 请登录后投票
   发表时间:2004-09-08  
关键是元数据能否通过某种机制自动类的行为产生影响,而不是通过另外的厂来构造.如日志属性,new 的对象的方法调用会自动写日志,说白了,有一个内置于语言的隐含厂.
0 请登录后投票
   发表时间:2004-09-08  
agilecat 写道
关键是元数据能否通过某种机制自动类的行为产生影响,而不是通过另外的厂来构造.如日志属性,new 的对象的方法调用会自动写日志,说白了,有一个内置于语言的隐含厂.


你觉得把这种feature内置在语言里很好?我倒觉得耦合太强了。很明显这个问题我只要用动态代理就可以解决,干吗要在语言里给我加上这些不必要的玩意?我需要倒也罢了,如果我不需要,岂不是还要为这些附加的复杂度买单?
0 请登录后投票
   发表时间:2004-09-08  
不是觉得的很好,只是觉得能否提供一个选择,当然默认不应该支持,打开一个开关,就支持了.
0 请登录后投票
   发表时间:2004-09-08  
幸好.NET attribute没有aop的动态功能强大,必须要从新编译,否则这将是一个致命的隐患.太可怕了,看来ms总是不能改掉一些臭习惯阿.
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics