UI與實體的對映

else發表於2021-09-09

分享一個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);

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2318/viewspace-2799970/,如需轉載,請註明出處,否則將追究法律責任。

相關文章