我有一个如下所示的域名模型:
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
}
在我的控制器中,我想从存储库中获取一个域对象,并将其作为viewmodel类型返回(我可以在其中添加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;
显然,这样的向下倾斜往往表明一种不那么出色的继承设置,但我不确定如何接近它。如果垂头丧气的话,这通常是可以接受的吗?派生的对象,还是我在这里做了一些特别错误的事情?
将域模型导入派生的视图模型的正确方法是什么?
进一步注意
起初我设置了我的viewmodel:
public class ProductViewModel {
public Domain.Product Product {get;set;}
public ViewBase Base {get; set;}
}
...这实际上使整个事情变得非常简单,因为我可以获得域模型并将其应用于属性。我的问题在于,我不能在客户端造成严重破坏,并且使用我正在使用的UI框架进行命名 - 远远,更容易在"模型级别拥有属性&# 34; (缺乏更好的学期)
答案 0 :(得分:1)
大多数情况下,UI要求与域要求非常不同。我会创建一个从您的域模型到视图模型的附加映射。您可能会认为存在一些重复,但正如我上面提到的 - 您的视图模型应该与您的域模型非常不同。从理论上讲,它们用于不同的目的,应该包含不同的东西。
如果您认为映射太“样板”,那么请使用AutoMapper等框架。