這是我最近一直需要做的常見事情,我一直在尋找任何常見模式,以使其更容易一些。用於在域模型之間映射數據的模式
它的主要要點是我有一些數據模型,它們被建模爲滿足ORM,並且純粹對對象執行CRUD操作。這些模型目前通過存儲庫/工廠暴露(取決於其C或RUD)。
然後我有一個視圖模型,這是一個更具可讀性,並與UI關注,如視圖之間的驗證和映射數據(這是一個ASP.MVC場景,但這種情況可以抽象爲大多數的情況下)。
因此可以說我去localhost/user/1,這應該去,並讓我的用戶在數據庫中的Id 1,然後顯示在用戶界面上。最終,這必須從數據域中拉下數據,然後將其映射到UI模型以進行顯示。
下面是一個示例場景:
public class OrmUser
{
public int Id {get;set;}
public string Name {get;set;}
public IList<Permission> Permissions {get;set;}
}
public class UiUser
{
[Required]
public int Id {get;set;}
[Required]
public string Name {get;set;}
public bool IsUserAdmin {get;set;}
}
public class UserMapper : IMapper<UiUser>
{
public UiUser Get(int id)
{
var ormUser = UserRepository.Get(id);
var uiUser = new UiUser
{
Id = ormUser.Id,
Name = ormUser.Name,
IsUserAdmin = IsUserAdmin(ormUser.Permissions)
}
}
private bool IsUserAdmin(IList<Permission> permissions)
{
return permissions.SomeLinq(ToFindIfTheyAreAnAdmin);
}
}
這是一個簡單的例子,但顯示了數據模型,如何含有大量相同類型的信息,但這個觀點有問題,你不關心所有的信息只是它的一個子集。通過這種方式,您不但可以抽象映射,還可以抽象與數據域的通信,但是您需要爲每種類型編寫一個映射器類,並且上面假定它是單向映射,而不是雙向映射將需要更多的代碼。
那麼你們如何進行這種映射?目前我正在編寫基本上允許UI層運行查詢的抽象映射器,並獲取視圖模型,將存儲庫和複製數據從一個模型抽象到另一個模型,並且它只是覺得應該有一個更好的這樣做的方法。
至於我的猜測是非常抽象的,你究竟想要映射到什麼? – sll
那麼它不是一個具體的模型,它的意思是有點抽象。我相信現在大多數Web應用程序都有多個層/域,它們包含相似的模型以表示相同類型的數據。我只是在尋找一種好的模式來管理層與層之間的映射和通信。雖然Paul已經給出了一個很好的答案,但會在我的原始問題中添加一些虛擬模型,以幫助查看後面的內容。 – Grofit
另外值得注意的是,雖然這是一個.net示例,但真正可以在任何語言中出現相同的情況。因此,任何語言不可知論模式都將是理想的,儘管用於緩解給定平臺的這個任務的框架也不錯...... – Grofit