将领域模型向下转换为 ViewModel
Downcast Domain Model to ViewModel
我有一个如下所示的领域模型:
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
}
在我的控制器中,我想从存储库中获取域对象,return它作为视图模型类型(然后我可以在其中添加基础):
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;
显然像这样的沮丧往往表明继承设置不太好,但我不确定如何处理它。如果向下转换是 "light" 派生对象,这通常是可以接受的,还是我在这里做错了什么?
将域模型导入派生视图模型的正确方法是什么?
进一步说明
起初我是这样设置视图模型的:
public class ProductViewModel {
public Domain.Product Product {get;set;}
public ViewBase Base {get; set;}
}
... 这实际上使整个事情变得非常简单,因为我可以获得域模型并将其应用于 属性。我对此的问题是我不能在客户端造成严重破坏并使用我正在使用的 UI 框架进行命名 - 在 "model level" 处拥有属性要容易得多(对于缺少更好的术语)
大多数时候,UI 要求与域要求有很大不同。我会创建一个从您的域模型到您的视图模型的附加映射。您可能会争辩说其中存在一些重复,但正如我上面提到的 - 您的视图模型应该与您的域模型有很大不同。从理论上讲,它们有不同的用途,应该包含不同的东西。
如果觉得映射太过"boilerplate",那就用AutoMapper之类的框架吧
我有一个如下所示的领域模型:
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
}
在我的控制器中,我想从存储库中获取域对象,return它作为视图模型类型(然后我可以在其中添加基础):
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;
显然像这样的沮丧往往表明继承设置不太好,但我不确定如何处理它。如果向下转换是 "light" 派生对象,这通常是可以接受的,还是我在这里做错了什么?
将域模型导入派生视图模型的正确方法是什么?
进一步说明
起初我是这样设置视图模型的:
public class ProductViewModel {
public Domain.Product Product {get;set;}
public ViewBase Base {get; set;}
}
... 这实际上使整个事情变得非常简单,因为我可以获得域模型并将其应用于 属性。我对此的问题是我不能在客户端造成严重破坏并使用我正在使用的 UI 框架进行命名 - 在 "model level" 处拥有属性要容易得多(对于缺少更好的术语)
大多数时候,UI 要求与域要求有很大不同。我会创建一个从您的域模型到您的视图模型的附加映射。您可能会争辩说其中存在一些重复,但正如我上面提到的 - 您的视图模型应该与您的域模型有很大不同。从理论上讲,它们有不同的用途,应该包含不同的东西。
如果觉得映射太过"boilerplate",那就用AutoMapper之类的框架吧