最初接触ORM概念还是从那本<ASP组件设计剖析>一书.并且,黄先生只是提了一下.
后来,在CNBLOGS上接触到不少ORM的字眼,看多了,知道跟NHibernate这类ORM工具有关.
也了解一点,就是想在对象和关系间建立某种映射关系.
最近又回想了一下黄忠诚那本组件设计的书.第三章他讲了一下Attribute
其中,有一部分讲述了Attribute在ORM中的简单应用
昨晚又想了想这个问题.下面是我的一点想法,希望大家指点
如果我们有一个业务对象Customer,下面是Customer的定义

public class Customer
{
#region 私有成员变量
private int _Id;
private string _Name;
private string _Address;
#endregion


#region 属性定义
public int Id
{
get{return(_Id);}
set{_Id=value;}
}

public string Name
{
get{return(_Name);}
set{_Name=value;}
}

public string Address
{
get{return(_Address);}
set{_Address=value;}
}

#endregion

public Customer()
{
}

~Customer()
{
}

}

这只是一个简单的业务对象的定义.
但是,假如按黄先生的看法,我们可以定义如下Attribute
public class FieldAttribute:System.Attribute
{
private string _FieldName;
public string FieldName
{
get{return(_FieldName);}
set{_FieldName=value;}
}

public FieldAttribute(string FldName)
{
FieldName
=FldName;
}

}

SORRY,发现CNBLOGS插入的代码没办法编辑,晕.上面的代码应该加入以下属性:
[AttributeUsage(AttributeTargets.Property)]
这样,我们就能将该Attribute贴在我们前面定义的业务对象的各个属性字段上,贴上去的效果类似以下:
public class Customer
{
//略过

[Field(
"UserName")]
public string Name
{
get{}
set{}
}

}

如果是这样的话,我们实例化一个Customer对象后,我们就可以利用反射来取出该对象的所有属性成员,并且
我们可以用TYPE对象的GetCustomerAttribute来获得该属性上的自定义Attribute.因此,我们可以用循环的方法得到每一个属性成员及与之对象的FieldAttribute的Fieldname
因此,我们等于是在业务对象和数据表字段间建立了映射.
我们只要利用第三方对象C,C有一批HELPER方法,例如,获取一个Customer,然后根据其ID从对应数据表中取出其余字段内容填充至该CUSTOMER上.
这样有什么意思呢?
我想,开发过ASP.NET项目的人都有一个头痛的问题,那就是,数据库中数据表的定义也许会是经常变动的.
当一个表添加了一个字段后,你就得做以下修改:
1,修改表,添加字段
2.修改数据存取层,以加入到此字段内容的获取(假如的话)
3.修改业务逻辑层,给业务对象加入此属性.
假如数据存取层能自动获得业务对象属性的变化,那该多好呢?
也就是说,假如业务对象多添加了一个属性,那么数据存取层的INSERT,UPDATE就知道自动去获取或更新对应的表中的字段.微软的DAAB在一定程度上已经减轻了我们写数据存取层的负担.
但是对于业务逻辑层部分,仍然很难与数据存取层保持同步.
假如我们能弃分利用ATTRIBUTE,以"贴"的形式将数据映射或者规则贴在该业务对象的属性上.
是不是能很好的解决问题呢?
我会写出一个演示来演示此问题
希望大家有更好的想法,踊跃讨论