gpt4 book ai didi

asp.net-mvc - 如何处理具有多个聚合根的 View 模型?

转载 作者:行者123 更新时间:2023-12-02 08:56:23 25 4
gpt4 key购买 nike

目前,我的 View 模型非常糟糕。

类看起来像这样=>

 public class AccountActionsForm
{
public Reader Reader { get; set; }
//something...
}

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

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

我了解 AutoMapper 框架,并且很可能会使用它。

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

<小时/>

我对 View 需要来自多个聚合根的数据的情况感到困惑。我正在创建具有图书馆、阅读器、书目记录等实体的应用程序。

就我而言 - 在域级别,将所有这 3 种类型分组为 LibraryReaderThatHasOrderedSomeBooks 或其他内容是没有意义的,但是应该显示特定图书馆中特定读者的订购书籍列表的 View 需要它们全部。

所以 - 似乎可以使用 OrderedBooksListModel View 模型创建 View OrderedBooksList ,并在其下保存 LibraryOutputReaderOutputBibliographicRecordOutput View 模型。或者甚至更好 - OrderedBooksListModel View 模型,利用 flattening technique并具有诸如 ReaderFirstNameLibraryName 等属性。

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

那么纯粹存在于 UI 层的 View 模型字段(即指示选中选项卡的枚举)又如何呢?

this在这种情况下每个人都会做什么?

 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);

看起来写了很多。 :)

<小时/>

Reading this眼下。和this .

<小时/>

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

alt text

所以 - 在我看来这已经有效了,现在是时候进行一些尝试了。

我的吉米

最佳答案

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

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

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

关于asp.net-mvc - 如何处理具有多个聚合根的 View 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2020499/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com