昨天介绍了ORM部分,由于Linq的用词不当,可能引起了部分人的误解,在些道歉。这里所说的Linq 仅仅只是Linq To Sql,切记切记。只是针对ORM处理部分。
在开始介绍业务层之前,再重提一下旧事吧。我的ORM是在2005年初开始设计的,在8月份,正式在项目里面开始使用,那时候Vs2005还在Beta1,一段时间之后才发布Beta2,当时还是冒了很大的风险的。因为项目启动的比较早,当时,哪里有现在这么多的资源?一切都是原创的,没有什么资料文档可以借鉴的。所有的完善、升级,都是经过项目之后,把经验教训加进来的。
其实ORM就是把关系与对象实现映射,提供简单的增删改查罢了,中间根据需要做一些优化罢了,最终还是为了方便业务逻辑的组织。在我的ORM里面,是把存储过程映射成类的,对于可变查询、多数据库支持,也是在后期才加进去的。特别是多数据库支持,刚开始根本就没有解决的思路,不能把连接写死,又不能改变编程模型,又要统一配置,对于程序员是透明的。举个夸张一点的例子,对于主从结构(通常主从结构不会存在不同的数据库),主表可能在一个数据库内,从表可能保存在另外一个数库内,编程的时候,程序员不知道,也不关心,单库与多库的代码是完全一样的,仅仅是配置文件的不同。对于客户端,当然更是透明的,连服务层都不知道数据的具体保存位置,实现了编程模型的统一。
说了那么多,下面把业务层的框架作一大致的介绍。
业务层,我这里叫BO,也是业务对象了。通常一个对象包含数据与方法,我业务层里数据与方法是分开的,第一个版本是合在一起的。分为Data与Service两个相关的类,对于Data里,包含一个Protected的Meta,就是Entity,Data把需要公开的属性公开出来就是Data的对外成员属性了,另外,工具还根据键关联的关联因也同时生成了,对于关联类,这里没有用通常的属性处理方式,要加进来的话,难度倒没有什么。

Code
namespace LG.Common.Data


{
[Unie2e.Common.Model.E2EDataAttribute("CityService")]
public partial class City : City<City>

{

关联父对象Field#region 关联父对象Field
private DataRef<Province, ProvinceService> province;
#endregion
public City()

{
}
public City(CityEntity meta) :
base(meta)

{
}

关联父对象Property#region 关联父对象Property
public virtual Province Province

{
get

{
if (!province.IsLoad)

{
// 在此添加获取方法

province.GetRelationData += delegate(ProvinceService service)
{ return service.FindByID(this.ProvinceId); };
//
}
return province.Data;
}
set

{
province.Data = value;
}
}
#endregion
}
public class City<T> : E2EData<T,CityEntity> where T:City<T>,new ()

{
public City()

{
}
public City(CityEntity meta) :
base(meta)

{
}

映射属性#region 映射属性

/**//// <summary>
/// 城市Id
/// </summary>
[Unie2e.Common.Model.E2EKeyAttribute()]
[Unie2e.Common.Model.E2EPropertyAttribute(true, false, 0, 0, 0, "", "城市Id")]
public System.Guid CityId

{
get

{
return this.meta.CityId;
}
set

{
if ((this.meta.CityId != value))

{
this.setModify();
this.meta.CityId = value;
}
}
}

/**//// <summary>
/// 省份Id
/// </summary>
[Unie2e.Common.Model.E2EPropertyAttribute(false, false, 0, 0, 0, "", "省份Id")]
public System.Guid ProvinceId

{
get

{
return this.meta.ProvinceId;
}
set

{
if ((this.meta.ProvinceId != value))

{
this.setModify();
this.meta.ProvinceId = value;
}
}
}

/**//// <summary>
/// 城市代码
/// </summary>
[Unie2e.Common.Model.E2EPropertyAttribute(false, false, 50, 0, 0, "", "城市代码")]
public string CityCode

{
get

{
return this.meta.CityCode;
}
set

{
if ((this.meta.CityCode != value))

{
this.setModify();
this.meta.CityCode = value;
}
}
}

/**//// <summary>
/// 城市名称
/// </summary>
[Unie2e.Common.Model.E2EPropertyAttribute(false, false, 50, 0, 0, "", "城市名称")]
public string CityName

{
get

{
return this.meta.CityName;
}
set

{
if ((this.meta.CityName != value))

{
this.setModify();
this.meta.CityName = value;
}
}
}

/**//// <summary>
/// 备注
/// </summary>
[Unie2e.Common.Model.E2EPropertyAttribute(false, true, 200, 0, 0, "", "备注")]
public string CityComment

{
get

{
return this.meta.CityComment;
}
set

{
if ((this.meta.CityComment != value))

{
this.setModify();
this.meta.CityComment = value;
}
}
}
#endregion

创建函数#region 创建函数
public new static T CreateNew()

{
T t = E2EData<T,CityEntity>.CreateNew();
t.CityId = Guid.NewGuid();
return t;
}
#endregion
}
}

Data是通过泛形实现的,主要是为了方便继承的处理了。他与Service配合。主要的变化是在Service。
上面为手工添加的主从结构处理代码。
下面为工具生成的部分
[Unie2e.Common.Model.E2EBOAttribute("Province")]
public class ProvinceService<T> : POSService<T,ProvinceEntity> where T:E2EData<ProvinceEntity> ,new ()

{
protected override T DataConvert(ProvinceEntity input)

{
T t = new T();
t.Meta = input;
return t;
}

自动生成的Actionr操作#region 自动生成的Actionr操作

/**//// <summary>
/// 通过关键字删除
/// </summary>
[Unie2e.Common.Model.E2EOperation("通过关键字删除", E2ETransactionScopeOption.Required)]
public int DeleteByID(Guid provinceid)

{
ProvinceActionParam provinceactionparam = new ProvinceActionParam();
provinceactionparam.Method = "DeleteByID";
if ((provinceid == System.Guid.Empty))

{
return 0;
}
provinceactionparam.ProvinceId = provinceid;
return base.Action(provinceactionparam);
}
#endregion

自动生成的查询方法#region 自动生成的查询方法

/**//// <summary>
/// 通过关键字查找
/// </summary>
[Unie2e.Common.Model.E2EOperation("通过关键字查找", E2ETransactionScopeOption.Suppress)]
public virtual T FindByID(Guid provinceid)

{
if ((provinceid == System.Guid.Empty))

{
return default(T);
}
ProvinceFindParam provincefindparam = new ProvinceFindParam();
provincefindparam.Method = "ByID";
provincefindparam.ProvinceId = provinceid;
ORMCollection<T> collection = base.Find(provincefindparam, Converter);
T returnT = default(T);
if (collection != null && collection.Count > 0)

{
return collection[0];
}
else

{
return returnT;
}
}

/**//// <summary>
/// 查找所有数据
/// </summary>
[Unie2e.Common.Model.E2EOperation("查找所有数