如何处理具有多个聚合根的视图模型?

Arn*_*psa 5 asp.net-mvc viewmodel automapper

目前,我的视图模型非常糟糕.

类看起来像这样=>

 public class AccountActionsForm
    {
        public Reader Reader { get; set; }
        //something...
    }
Run Code Online (Sandbox Code Playgroud)

问题是Reader类型来自域模型(违反SRP).

基本上,我正在寻找设计技巧(即将视图模型拆分为输入/输出是一个好主意吗?)如何使我的视图模型无摩擦和开发人员友好(即 - 映射应该使用控制器基类自动工作) ?

我知道AutoMapper框架,我可能会使用它.

那么,再一次 - 在尝试创建正确的视图模型时常见的问题是什么?如何构建它?当需要多域对象输入时如何进行映射?


当视图需要来自多个聚合根的数据时,我感到困惑.我正在创建app,其中包含Library,Reader,BibliographicRecord等实体.

在我的情况下 - 在域级别,将所有这3种类型分组到LibraryReaderThatHasOrderedSomeBooks或什么不是没有意义,但是应该显示特定库中特定读者的有序书籍列表的视图需要它们.

所以-它似乎好创建视图OrderedBooksListOrderedBooksListModel视图模型下保存LibraryOutput,ReaderOutputBibliographicRecordOutput视图模型.甚至更好- OrderedBooksListModel视图模型,它利用平整技术和拥有的道具一样ReaderFirstName,LibraryName等等.

但这会导致映射问题,因为有多个输入.
它不再是1:1关系,我只踢一个聚合根.
这是否意味着我的域模型是错的?

那些纯粹存在于UI层的视图模型字段(即指示已检查选项卡的枚举)呢?

就是是什么每个人都在这样的情况?

 FooBarViewData fbvd = new FooBarViewData();
   fbvd.Foo = new Foo(){ A = "aaa"};
   fbvd.Bar = new Bar(){ B = "bbb"};
   return View(fbvd);
Run Code Online (Sandbox Code Playgroud)

我不愿意这样做=>

var fbvd = new FooBarViewData();
   fbvd.FooOutput =  _mapper.Map<Foo,FooOutput>(new Foo(){ A = "aaa"});
   fbvd.BarOutput = _mapper.Map<Bar,BarOutput>(new Bar(){ B = "bbb"});
   return View(fbvd);
Run Code Online (Sandbox Code Playgroud)

好像很多写作.:)


现在读这个.而且这个.


好.我想了很多这个问题,是的 - 添加另一个抽象层似乎是一个解决方案=>

替代文字http://i46.tinypic.com/fe14qp.jpg

所以 - 在我看来这已经有效了,现在是时候进行一些玩弄了.

吉米

Jim*_*ard 4

很难定义所有这些,但这里是。我们喜欢将视图看到的内容与控制器构建的内容分开。视图看到一个扁平的、脑死亡的、类似 DTO 的物体。我们称之为视图模型。

在控制器方面,我们构建了构建视图模型所需内容的丰富图表。这可能只是一个聚合根,也可能是多个聚合根的组合。所有这些组合在一起就形成了我们所说的表示模型。有时,表示模型只是我们的持久性(域)模型,但有时它完全是一个新对象。然而,我们在实践中发现,如果我们需要构建一个复合的表示模型,它往往会成为相关行为的磁石。

在您的示例中,我将创建一个 ViewFooBarModel 和一个 ViewFooBarViewModel (或 ViewFooBarModelDto)。然后,我可以在控制器中讨论 ViewFooBarModel,然后依靠映射来使用 AutoMapper 从这个中间模型中展平我需要的内容。