将域模型向下转换为视图模型
本文关键字:模型 视图 转换 | 更新日期: 2024-10-31 01:24:41
我有一个域模型,如下所示:
public class Procuct {
string Name {get;set;}
double Price {get;set;}
}
我有一个存储库,可以获取如下项目:
public Domain.Product GetProduct(int id) {
// (maps from my ORM model to my domain model)
return ProductMapping.MapProduct(dataService.GetProductEntity(id));
}
我喜欢这个,因为现在我有了可以在任何需要的地方使用域模型。
在 MVC 中,我想使用这个模型,还有一些额外的功能,所以我有一个 ProductViewModel:
public class ProductViewModel : Domain.Product {
public ViewBase Base {get;set;} // standarized helper stuff in here
}
在我的控制器中,我想从存储库中获取一个域对象,并将其作为视图模型类型返回(然后我可以在其中添加 Base):
public ActionResult ShowProduct(int productID) {
var model = new ProductViewModel();
model = repository.GetProduct(productID) AS ProductViewModel;
model.Base = new ViewBase() { /* settings here */ };
return View(model);
}
气味
这似乎应该可以很好地工作,但我对这行有一种我不喜欢的味道:
model = repository.GetProduct(productID) AS ProductViewModel;
显然,像这样的向下投射往往表明继承设置不太出色,但我不确定如何处理它。 如果向下投向的是"轻"派生对象,这是否普遍可以接受,或者我在这里做错了什么特别错误的事情?
将域模型放入派生视图模型的正确方法是什么?
进一步说明
起初,我像这样设置了我的视图模型:
public class ProductViewModel {
public Domain.Product Product {get;set;}
public ViewBase Base {get; set;}
}
。这实际上使整个事情变得非常容易,因为我可以获取域模型并将其应用于属性。 我的问题是我不能对客户端造成严重破坏,并使用我正在使用的 UI 框架命名 - 在"模型级别"拥有属性要容易得多(因为缺乏更好的术语)
大多数情况下,UI 要求与域要求有很大不同。我将创建从您的域模型到您的视图模型的附加映射。您可能会争辩说存在一些重复,但正如我上面提到的 - 您的视图模型应该与您的领域模型非常不同。从理论上讲,它们服务于不同的目的,应该包含不同的东西。
如果您觉得映射过于"样板",请使用像AutoMapper这样的框架。
https://github.com/AutoMapper/AutoMapper