本文共 8278 字,大约阅读时间需要 27 分钟。
框架从层次结构上分主要分为:ORM层、Meta层、BO层、SO层、数据交换层、DTO层、服务层、代理层、外观层,这几大层。
ORM层:主要提供,存储过程、配置文件的翻译,实现数据库与实体数据的映射。由框架提供。
Meta层:主要提供,数据库与对象的映射,由工具生成,在98%的应用场合不用更改
BO层:业务逻辑层,核心的业务逻辑,基本关联已经由工具生成,可以在此层处理特定业务逻辑,如果涉及分布式数据访问,需要在此进行稍加改动。对于关联结构、主从结构要在此加上关联处理,重写OnBeforeAdded/onAfterAdded/等。加入特定业务。建议通用查询/配置过程的处理,在这里重写一下,不要以ActionId对外开放。(在Demo里面没有给出通用查询/配置过程的处理,类似于Ibatis的配置文件)
SO层:业务外观层,主要是与客户端打交道,提供客户端所需要的数据。SO层与DTO和数据交换相互配合,传输客户端需要的数据。提供声明性事务、声明性服务。工具根据BO业务层生成SO层代码。
数据交换层:实现DTO层与BO层的数据交换,实现客户端的数据与业务数据的连接。工具生成基本代码。
服务层:根据BO生成的配置文件,提供基于Http信道的服务。(可以提供TCPIP等其他信道)主要服务主框架提供,需要在此配置基本连接字符串,设置配置文件的路径等。
代理层:由工具生成,配置文件根据服务生成。
外观层:当前只提供CS的界面生成,BS界面下一步加入。主要提供了列表的配置、列表界面、明细界面的生成,对于主从、关联结构的自动触发机制。客户端生成代码的质量非常高,基本应用的改动很小。
下面把每一部分的代码一一介绍
namespace Unie2e.Yuking.Enities{ using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Data.SqlClient; using Unie2e.Common; using Unie2e.ORM; using Unie2e.ORM.Mapping; [System.SerializableAttribute()] [Unie2e.ORM.Mapping.TableAttribute("DO", MapFileName="DOCustParam.Xml")] public sealed class DOEntity : Unie2e.ORM.Mapping.Entity { /**//// <summary> /// 映射字段的总长度 /// </summary> private const int length = 5; 映射字段#region 映射字段 /**//// <summary> /// 送货单Id /// </summary> [Unie2e.ORM.Mapping.FieldAttribute("DO", "DOId", true, SqlDbType.UniqueIdentifier, 0, 0, 0, "送货单Id")] public Guid DOId = System.Guid.NewGuid(); /**//// <summary> /// 客户Id /// </summary> [Unie2e.ORM.Mapping.FieldAttribute("DO", "CustomerId", false, SqlDbType.UniqueIdentifier, 0, 0, 0, "客户Id")] public Guid CustomerId = System.Guid.Empty; /**//// <summary> /// 送货单号 /// </summary> [Unie2e.ORM.Mapping.FieldAttribute("DO", "DONumber", false, SqlDbType.VarChar, 128, 0, 0, "送货单号")] public String DONumber; /**//// <summary> /// 送货单状态 /// </summary> [Unie2e.ORM.Mapping.FieldAttribute("DO", "DOStatus", false, SqlDbType.Int, 0, 10, 0, "送货单状态")] public Int32 DOStatus = 0; /**//// <summary> /// 备注 /// </summary> [Unie2e.ORM.Mapping.FieldAttribute("DO", "DOComment", false, SqlDbType.VarChar, 512, 0, 0, "备注")] public String DOComment; #endregion 重载基类函数#region 重载基类函数 public override void Initialize(object[] parameters) { if ((length != parameters.Length)) { throw new E2EException("参数个数与字段数不相等"); } DOId = ((System.Guid)(parameters[0])); CustomerId = ((System.Guid)(parameters[1])); DONumber = ((string)(parameters[2])); DOStatus = ((int)(parameters[3])); DOComment = ((string)(parameters[4])); } public override object[] ToArray() { object[] objs = new object[5]; objs[0] = DOId; objs[1] = CustomerId; objs[2] = DONumber; objs[3] = DOStatus; objs[4] = DOComment; return objs; } #endregion } [System.SerializableAttribute()] [Unie2e.ORM.Mapping.TableAttribute("DO")] public abstract class DOFindParam<T> : EntityParam<T> where T: IEntity { /**//// <summary> /// 映射字段的总长度 /// </summary> private const int length = 6; 映射字段#region 映射字段 [Unie2e.ORM.Mapping.FieldAttribute("DO", "Method", SqlDbType.VarChar, 50, 0, 0, "")] public String Method; [Unie2e.ORM.Mapping.FieldAttribute("DO", "DOId", SqlDbType.UniqueIdentifier, 0, 0, 0, "")] public Guid DOId = System.Guid.Empty; [Unie2e.ORM.Mapping.FieldAttribute("DO", "CustomerId", SqlDbType.UniqueIdentifier, 0, 0, 0, "")] public Guid CustomerId = System.Guid.Empty; [Unie2e.ORM.Mapping.FieldAttribute("DO", "DONumber", SqlDbType.VarChar, 128, 0, 0, "")] public String DONumber; [Unie2e.ORM.Mapping.FieldAttribute("DO", "DOStatus", SqlDbType.Int, 0, 10, 0, "")] public Int32 DOStatus = 0; [Unie2e.ORM.Mapping.FieldAttribute("DO", "DOComment", SqlDbType.VarChar, 512, 0, 0, "")] public String DOComment; #endregion 重载基类函数#region 重载基类函数 public override object[] ToArray() { object[] objs = new object[6]; objs[0] = Method; objs[1] = DOId; objs[2] = CustomerId; objs[3] = DONumber; objs[4] = DOStatus; objs[5] = DOComment; return objs; } public override void Initialize(object[] parameters) { if ((length != parameters.Length)) { throw new E2EException("参数个数与字段数不相等"); } Method = ((String)(parameters[0])); DOId = ((Guid)(parameters[1])); CustomerId = ((Guid)(parameters[2])); DONumber = ((String)(parameters[3])); DOStatus = ((Int32)(parameters[4])); DOComment = ((String)(parameters[5])); } #endregion } [System.SerializableAttribute()] [Unie2e.ORM.Mapping.TableAttribute("DO")] public sealed class DOFindParam : DOFindParam<DOEntity> { } [System.SerializableAttribute()] [Unie2e.ORM.Mapping.TableAttribute("DO")] public abstract class DOActionParam<T> : EntityParam<T> where T: IEntity { /**//// <summary> /// 映射字段的总长度 /// </summary> private const int length = 2; 映射字段#region 映射字段 [Unie2e.ORM.Mapping.FieldAttribute("DO", "Method", SqlDbType.VarChar, 50, 0, 0, "")] public String Method; [Unie2e.ORM.Mapping.FieldAttribute("DO", "DOId", SqlDbType.UniqueIdentifier, 0, 0, 0, "")] public Guid DOId = System.Guid.Empty; #endregion 重载基类函数#region 重载基类函数 public override object[] ToArray() { object[] objs = new object[2]; objs[0] = Method; objs[1] = DOId; return objs; } public override void Initialize(object[] parameters) { if ((length != parameters.Length)) { throw new E2EException("参数个数与字段数不相等"); } Method = ((String)(parameters[0])); DOId = ((Guid)(parameters[1])); } #endregion } [System.SerializableAttribute()] [Unie2e.ORM.Mapping.TableAttribute("DO")] public sealed class DOActionParam : DOActionParam<DOEntity> { }}
namespace Unie2e.Yuking.Data { using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Data.SqlClient; using Unie2e.Common; using Unie2e.ORM; using Unie2e.ORM.Mapping; using Unie2e.Service; using Unie2e.Yuking.Enities; using Unie2e.Yuking.Service; using Unie2e.Yuking.Common; public class DO<T> : E2EData<T,DOEntity> where T:DO<T>,new () { public DO() { } public DO(DOEntity meta) : base(meta) { } 映射属性#region 映射属性 /**//// <summary> /// 送货单Id /// </summary> [Unie2e.Common.Model.E2EKeyAttribute()] [Unie2e.Common.Model.E2EPropertyAttribute(true, false, 0, 0, 0, "", "送货单Id")] public System.Guid DOId { get { return this.meta.DOId; } set { if ((this.meta.DOId != value)) { this.setModify(); this.meta.DOId = value; } } } /**//// <summary> /// 客户Id /// </summary> [Unie2e.Common.Model.E2EPropertyAttribute(false, false, 0, 0, 0, "", "客户Id")] public System.Guid CustomerId { get { return this.meta.CustomerId; } set { if ((this.meta.CustomerId != value)) { this.setModify(); this.meta.CustomerId = value; } } } /**//// <summary> /// 送货单号 /// </summary> [Unie2e.Common.Model.E2EPropertyAttribute(false, false, 128, 0, 0, "", "送货单号")] public string DONumber { get { return this.meta.DONumber; } set { if ((this.meta.DONumber != value)) { this.setModify(); this.meta.DONumber = value; } } } /**//// <summary> /// 送货单状态 /// </summary> [Unie2e.Common.Model.E2EPropertyAttribute(false, false, 0, 10, 0, "", "送货单状态")] public ActiveStatus DOStatus { get { return (ActiveStatus)this.meta.DOStatus; } set { if ((this.meta.DOStatus != (int)value)) { this.setModify(); this.meta.DOStatus = (int)value; } } } /**//// <summary> /// 备注 /// </summary> [Unie2e.Common.Model.E2EPropertyAttribute(false, true, 512, 0, 0, "", "备注")] public string DOComment { get { return this.meta.DOComment; } set { if ((this.meta.DOComment != value)) { this.setModify(); this.meta.DOComment = value; } } } #endregion 创建函数#region 创建函数 public new static T CreateNew() { T t = E2EData<T,DOEntity>.CreateNew(); t.DOId = Guid.NewGuid(); return t; } #endregion } [Unie2e.Common.Model.E2EDataAttribute("DOService")] public class DO : DO<DO> { 关联子集合Field#region 关联子集合Field private DataRef<ORMCollection<DOItem>, DOItemService> dOItem; #endregion 关联父对象Field#region 关联父对象Field private DataRef<Customer, CustomerService> customer; #endregion public DO() { } public DO(DOEntity meta) : base(meta) { } 关联子集合Property#region 关联子集合Property public virtual ORMCollection<DOItem> DOItemCollection { get { if (!dOItem.IsLoad) { // 在此添加获取方法 dOItem.GetRelationData += delegate(DOItemService service) { return service.FindByDOId(this.DOId); }; // } return dOItem.Data; } set { dOItem.Data = value; } } #endregion 关联父对象Property#region 关联父对象Property public virtual Customer Customer { get { if (!customer.IsLoad) { // 在此添加获取方法 customer.GetRelationData += delegate(CustomerService service) { return service.FindByID(this.CustomerId); }; // } return customer.Data; } set { customer.Data = value; } } #endregion }}