将领域模型向下转换为 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之类的框架吧

https://github.com/AutoMapper/AutoMapper