目前,我得到了非常糟糕的视图模型。
类看起来像这样=>
public class AccountActionsForm
{
public Reader Reader { get; set; }
//something...
}
问题是 Reader 类型来自域模型(违反 SRP)。
基本上,我正在寻找设计技巧(即,将视图模型拆分为输入/输出是个好主意吗?)如何使我的视图模型无摩擦且对开发人员友好(即 - 映射应该使用控制器基类自动工作) ?
我知道 AutoMapper 框架,我很可能会使用它。
那么,再一次 - 尝试创建正确的视图模型时常见的问题是什么?如何构造它?当需要多域对象输入时如何进行映射?
当视图需要来自多个聚合根的数据时,我感到困惑。我正在创建具有图书馆、阅读器、书目记录等实体的应用程序。
在我的情况下 - 在域级别,将所有这 3 种类型分组LibraryReaderThatHasOrderedSomeBooks
或诸如此类是没有意义的,但是应该显示关于特定图书馆中特定读者的订购书籍列表的视图需要它们全部。
OrderedBooksList
所以 -用OrderedBooksListModel
下面的视图模型和LibraryOutput
视图模型创建视图似乎很好。甚至更好的视图模型,它利用展平技术并具有诸如等的道具。ReaderOutput
BibliographicRecordOutput
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);
我不愿意这样做=>
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);
好像写了很多。:)
行。我对这个问题想了很多,是的 - 添加另一个抽象层似乎是一个解决方案 =>
所以 - 在我看来,这已经奏效了,现在是玩弄的时候了。
泰吉米