为什么在这里我提出在代码文件的基础上再生相关的代码附属文件呢,为什么不直接在原代码文件写完整就可以了;原因很简单因为手写代码是没有电脑来得快,最主要一个原因是基于XML的IVsSingleFileGenerator在某方面不好所以才采用基于代码文件的方式作为代码描述模板.用XML描述在现情况碰到的问题,在我的数据持久层里是采用XML结合IVsSingleFileGenerator来生成相关实体类的.
内容大概如下:
<SmarkDatamodels xmlns="http://SmarkData.cn/model.xsd" >
<Class Name="Customer" Table="vp_Customer">
<ID Name="CustomerID" Type="System.Int64"/>
<Property Name="UserName" Type="System.String" Comment="用户名"/>
<Property Name="UserPWD" Type="System.String" Comment="用户密码"/>
<Property Name="CustomerType" Type="System.Int32" Comment="客户类型"/>
<Property Name="CustomerName" Type="System.String" Comment="自定义名"/>
<Property Name="Sex" Type="System.Boolean" Comment="性别"/>
<Property Name="Region" Type="System.String" Comment="地区"/>
<Property Name="City" Type="System.String" Comment="城市"/>
<Property Name="IDCard" Type="System.String" Comment="身份证号"/>
<Property Name="EMail" Type="System.String" Comment="电子邮件"/>
<Property Name="Phone" Type="System.String" Comment="电话"/>
</Class>
</SmarkDatamodels>
VsSingleFileGenerator会根据XML生成以下相关实体:
/// <summary>
/// 用户名
/// </summary>
public virtual string UserName {
get {
return this.mUserName;
}
set {
this.mUserName = value;
this.EntityState.FieldChange("UserName");
}
}
/// <summary>
/// 用户密码
/// </summary>
public virtual string UserPWD {
get {
return this.mUserPWD;
}
set {
this.mUserPWD = value;
this.EntityState.FieldChange("UserPWD");
}
}
/// <summary>
/// 客户类型
/// </summary>
public virtual int CustomerType {
get {
return this.mCustomerType;
}
set {
this.mCustomerType = value;
this.EntityState.FieldChange("CustomerType");
}
}
VsSingleFileGenerator有个不好的地方就是当主文件修改后会重新生成附属文件,这样就导致你无法修改代码文件.如果想为某些属性成员添加Attribute来处理一些功能基本是没办法的.
如添加成员数据验证:
[NotNull]
[Length("5","16","用户名长度必须在5-16个字符内!")]
public string UserName
{
get;
set;
}
即使能解决VsSingleFileGenerator生成附属文件冲突问题;但也要面对另一个问题,就如何扩展XML来处理这些扩展呢,添加XMLSchema扩展描述规则,重写VsSingleFileGenerator代码生成部份;这样下来没多久我估计自己会疯了....
实际情况添加不同Attribute来扩展辅助功能是很常见的事情,就一个验证来说根据实际情况就有很多情况,类构造方式也不一样.就针对这些情况来扩展XMLSchema和重写VsSingleFileGenerator带来的工作量就不用说了,还有一个问题就是XML并不能提供类型编译的保证这样对XML的质量是很难保证.
经过了一段时间的思考发现为什么不直接用代码作为原模板呢,这样就能得到IDE的支持,