UI与实体的映射
分享一個2006年的小組件。那會在.NET,比較流行的ORM就是NHiberate和IBatis.NET了。在用到這些ORM框架時,經常需要將界面的輸入經過處理后轉換成實體,最終通過ORM框架映射到數據庫。不知道大家使用最簡單的賦值還是使用類似UIMapper的組件。我的方法是自己設計了一個O-O Map的組件,將一個Object的值通過聲明的特性轉換到另一個Object,同時也支持反向映射。由于窗體也就是一個Object,該組件可以滿足普通OO映射之外,還可以滿足WinForm和WebForm映射。該組件示例如下:
(1)一個UI表單
(2)相應的實體類,加上了映射特性
public class UserEntity
{
?? ?……
?? ?[Member]? //表示實體類與窗體類成員Age的值想對應。
?? ?public int Age;
?? ?[Control]? //表示實體類與窗體類控件成員Name的值映射。
?? ?public string Name
?? ?{
?? ??? ?get { return _name; }
?? ??? ?set { _name = value; }
?? ?}
?? ?[Control("CardNo.Text")]? //表示實體類與窗體類控件成員的Text屬性相映射,注意,可以指定Path格式。
?? ?public string CardNo
?? ?{
?? ??? ?get { return _cardNo; }
?? ??? ?set { _cardNo = value;?? ?}
?? ?}
?? ?……
}
public class EmployeeEntity
{
?? ?……
?? ?[Reference(typeof(UserEntity))]? //引用了UserEntity的映射。
?? ?public UserEntity User
?? ?{
?? ??? ?get { return _user; }
?? ??? ?set { _user = value; }
?? ?}
?? ?[Control]? //控件
?? ?public float PostSalary
?? ?{
?? ??? ?get { return _postSalary; }
?? ??? ?set { _postSalary = value; }
?? ?}
?? ?……?? ?
}
(3)在窗體類中調用ObjectEngine實現OO映射。窗體就是一個繼承Form的類,因此,O-O Mapper即可以支持普通映射,也可以支持UI to Entity映射。
1)實現表單類與實體類映射
private void Map_Click(object sender, System.EventArgs e)
{
?? ?this.o = CZB.ObjectMapper.ObjectEngine.
Map(this,typeof(EmployeeEntity)) as EmployeeEntity;
}
2)實現實體類與表單類的映射
private void InverseMap_Click(object sender, System.EventArgs e)
{
?? ?this.o.User.Name = "c.z.b in";
?? ?this.o.User.Age = 19;
?? ?this.o.CompoInsurance = 0;
?? ?CZB.ObjectMapper.ObjectEngine.InverseMap(this,o);
}
這個小組件功能非常簡單也很有限,僅供一些參考。Demo如附件。/Files/baihmpgy/CZB.ObjectMapper.Test.rar 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
(1)一個UI表單
(2)相應的實體類,加上了映射特性
public class UserEntity
{
?? ?……
?? ?[Member]? //表示實體類與窗體類成員Age的值想對應。
?? ?public int Age;
?? ?[Control]? //表示實體類與窗體類控件成員Name的值映射。
?? ?public string Name
?? ?{
?? ??? ?get { return _name; }
?? ??? ?set { _name = value; }
?? ?}
?? ?[Control("CardNo.Text")]? //表示實體類與窗體類控件成員的Text屬性相映射,注意,可以指定Path格式。
?? ?public string CardNo
?? ?{
?? ??? ?get { return _cardNo; }
?? ??? ?set { _cardNo = value;?? ?}
?? ?}
?? ?……
}
public class EmployeeEntity
{
?? ?……
?? ?[Reference(typeof(UserEntity))]? //引用了UserEntity的映射。
?? ?public UserEntity User
?? ?{
?? ??? ?get { return _user; }
?? ??? ?set { _user = value; }
?? ?}
?? ?[Control]? //控件
?? ?public float PostSalary
?? ?{
?? ??? ?get { return _postSalary; }
?? ??? ?set { _postSalary = value; }
?? ?}
?? ?……?? ?
}
(3)在窗體類中調用ObjectEngine實現OO映射。窗體就是一個繼承Form的類,因此,O-O Mapper即可以支持普通映射,也可以支持UI to Entity映射。
1)實現表單類與實體類映射
private void Map_Click(object sender, System.EventArgs e)
{
?? ?this.o = CZB.ObjectMapper.ObjectEngine.
Map(this,typeof(EmployeeEntity)) as EmployeeEntity;
}
2)實現實體類與表單類的映射
private void InverseMap_Click(object sender, System.EventArgs e)
{
?? ?this.o.User.Name = "c.z.b in";
?? ?this.o.User.Age = 19;
?? ?this.o.CompoInsurance = 0;
?? ?CZB.ObjectMapper.ObjectEngine.InverseMap(this,o);
}
這個小組件功能非常簡單也很有限,僅供一些參考。Demo如附件。/Files/baihmpgy/CZB.ObjectMapper.Test.rar 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結