Downcast Domain Model to ViewModel

时间:2016-04-20 15:43:23

标签: c# downcast

我有一个如下所示的域名模型:

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; (缺乏更好的学期)

1 个答案:

答案 0 :(得分:1)

大多数情况下,UI要求与域要求非常不同。我会创建一个从您的域模型到视图模型的附加映射。您可能会认为存在一些重复,但正如我上面提到的 - 您的视图模型应该与您的域模型非常不同。从理论上讲,它们用于不同的目的,应该包含不同的东西。

如果您认为映射太“样板”,那么请使用AutoMapper等框架。

https://github.com/AutoMapper/AutoMapper