将域模型向下转换为视图模型

本文关键字:模型 视图 转换 | 更新日期: 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