在域模型之间映射数据的模式

2023-12-29

这是我最近需要做的一件常见的事情,我正在寻找任何常见的模式来使这变得更容易一些。

这一切的主要要点是我有一些数据模型,它们被建模来满足 ORM 并纯粹对对象进行 CRUD 操作。这些模型目前通过存储库/工厂公开(取决于其 C 还是 RUD)。

然后,我有一个视图模型,它更具可读性,并且充满了 UI 问题,例如视图之间的验证和映射数据(这是一个 ASP.MVC 场景,但这种情况可以抽象为大多数情况)。

假设我转到 localhost/user/1,应该会在数据库中获取 ID 为 1 的用户,然后将其显示在 UI 上。最终,这必须从数据域中提取数据,然后将其映射到 UI 模型以用于显示目的。

这是一个示例场景:

public class OrmUser
{
    public int Id {get;set;}
    public string Name {get;set;}
    public IList<Permission> Permissions {get;set;}
}

public class UiUser
{
    [Required]
    public int Id {get;set;}
    [Required]
    public string Name {get;set;}
    public bool IsUserAdmin {get;set;}
}

public class UserMapper : IMapper<UiUser>
{
    public UiUser Get(int id)
    {
        var ormUser = UserRepository.Get(id);
        var uiUser = new UiUser
        {
            Id = ormUser.Id,
            Name = ormUser.Name,
            IsUserAdmin = IsUserAdmin(ormUser.Permissions)
        }
    }

    private bool IsUserAdmin(IList<Permission> permissions)
    {
        return permissions.SomeLinq(ToFindIfTheyAreAnAdmin);
    }
}

这是一个简单的示例,但显示了数据模型如何包含大量相同类型的信息,但在这个有问题的视图中,您不关心所有信息,而只关心其中的一个子集。这样,有了映射器,您不仅可以抽象映射,还可以抽象与数据域的通信,但是您需要为每种类型编写一个映射器类,并且上面假设它是单向映射,而不是双向映射需要更多代码。

那么你们是如何进行这个映射的呢?目前我刚刚编写抽象映射器,它基本上允许 UI 层运行查询,并返回视图模型,抽象存储库并将数据从一个模型复制到另一个模型,感觉应该有一个更好的方法来做到这一点。


在 .net 中,你可能应该看看 Automapper

https://github.com/AutoMapper/AutoMapper https://github.com/AutoMapper/AutoMapper

它本质上允许您执行以下操作:

CreateMap<Domain.Customer, ViewModel.Customer>()

然后您可以通过以下方式在两者之间进行映射:

var vmCustomer = Mapper.Map<Domain.Customer, ViewModel.Customer>(domainCustomer);

它可能会为您节省大量样板代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在域模型之间映射数据的模式 的相关文章

  • 在应用程序中搜索对象的设计模式

    需要一些有关设计模式的帮助 我正在创建一个应用程序 该应用程序在存储在单独表中的数据库中的对象上具有不同类型 例如 我有 5 种对象 A B C D E 我在数据库中有 5 个不同的表来存储每个对象 现在 我想在我的应用程序中实现搜索功能
  • 如何使用工厂来创建使用策略模式的对象?

    假设我们的在线商店有一个简单的支付功能 我们希望使用不同的交易处理器来管理不同的交易 交易可以是付款或退款 交易处理器可以是 Paypal 或 Payplug 所以我们有以下课程 class PaymentTransaction imple
  • 这是一个不正确的警告吗?

    让我们看看我经常看到的这个代码模式 struct Foo template
  • SQL Server T-SQL 中的 REGEXP_LIKE 转换

    我在一份需要转换为 SQL Server 的旧报告中遇到了这一行 REGEXP LIKE examCodes learner code examCodes 是源 learner code 是模式 我知道 SQL Server 没有 REGE
  • 为什么要分离接口和实现?

    在生产代码中 我经常看到定义如下的类 public interface SomeComponent Some methods public class SomeComponentImpl implements SomeComponent S
  • “上下文模式”的这种实现看起来不错吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有多个处理单元可能存在于一个数组中 每个处理单元都有自己的参数 我想使用以下方式传达每个处理单元的参数上下文模式在它被建议作为另一个问题的解答 ht
  • 策略模式的现实示例

    我一直在读关于OCP原理 http en wikipedia org wiki Open closed principle以及如何使用策略模式来实现这一目标 我打算尝试向几个人解释这一点 但我能想到的唯一例子是根据 订单 的状态使用不同的验
  • 实施策略模式的函数式方法

    我正在尝试解决一个处理从一种温度单位到另一种温度单位 摄氏度 开尔文 华氏度 转换的问题 在Java中 我需要创建一个接口并提供多个实现来封装输入类型并将结果作为输出类型的单元返回 例如开尔文到摄氏度或摄氏度到华氏度等 我已经在 scala
  • 我的 POST 编辑操作是否会覆盖 EF 中的所有字段?

    假设我有一个包含 7 个字段的数据库记录 我只想编辑字段 1 的内容 所以我点击了 GET EDIT 操作 它使用我的视图模型呈现强类型视图 然后我继续更新字段 1 但是 我的POST 操作包含所有字段的 映射 如下所示 实体框架也是如此
  • STL(标准模板库)中使用的设计模式

    我正在学习STL和设计模式 我想知道是否有任何文档或链接可以解释如何在 STL 中实现设计模式 我做了谷歌但无法获得太多数据 我希望你的意思是 哪些设计模式可以在STL中识别 STL 堆栈是一个容器适配器 适配器是一种设计模式 迭代器也是一
  • 谁应该在 MvvmCross 中创建视图模型实例

    澄清一下 我知道 MvvmCross 在创建视图模型的位置和方式方面非常灵活 我的问题更多的是关于适当的关注点分离 以简化复杂的跨平台应用程序的设计 假设我们有一个包含客户列表和客户详细信息的应用程序 在 iPad 和 Surface 上
  • 在 C++ 中创建观察者设计模式的好方法

    我正在尝试用 C 实现观察者设计模式 如下所示 include
  • 如何在 Rails 2.3.5 中从模型渲染部分

    我有一个 Rails 2 3 5 应用程序 我试图从模型中渲染几个部分 我知道 我知道 我不应该这样做 我这样做的原因是我将 Comet 服务器 APE 集成到我的 Rails 应用程序中 并且需要根据模型的事件 例如 after crea
  • 三层 Asp.Net 应用程序中的异常处理

    1 据我了解 在three tierAsp Net应用程序我们应该通过以下方式实现异常处理 a 我们应该把try catch围绕代码块 位于三层中的任何一层 我们希望页面能够从该代码块正常恢复 当此代码生成异常时 b 我们不应该放try c
  • Room - LiveData 观察器在数据库更新时不会触发

    我试图在下面的代码中找出 为什么在我用新数据填充数据库后 Room 的 LiveData observable 不会给我新的转变 这是放在我的活动的 onCreate 方法中 shiftsViewModel ViewModelProvide
  • 如何设置管理员批准模型的编辑

    我需要一个普通用户可以编辑模型的系统 但编辑实际上只有在管理员批准后才会发生 我发现了一颗宝石 叫做纸迹 https github com airblade paper trail它确实有模型版本控制 但不具体支持我想要做的事情 我想知道其
  • 在关系数据库中存储树结构的已知方法有哪些? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • iostream 对象 cin、cout、cerr 和 clog 是如何实现的?

    iostream 对象 cin cout cerr 和 clog 是在 iostream 标头中声明的对象 我知道在某些编译器中可能会在构造这些 iostream 对象之前尝试使用它们 因此在某些情况下它们必须受到 静态初始化顺序失败 的影
  • 策略模式还是命令模式?

    假设我有一个金融交易列表 我需要针对这些交易执行一系列验证规则 一个例子是我有一笔购买产品的交易 但是首先我需要验证交易中的帐户是否有足够的可用资金 产品没有售完等 由于这些规则 交易将是标记为拒绝 并应指定错误代码 当然 我正在考虑用一个
  • 使用接口或函数对象进行回调? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在面向对象中 通常使用接口来实现回调 粗略示例 class Message class IMsgProcessor public virtual

随机推荐

  • Webhooks 可以与 GitHub OAuth 应用程序一起使用吗?

    所以我一直在阅读 GitHub 开发人员文档 关于 webhooks 他们有以下声明 Webhooks 允许您构建或设置订阅 GitHub com 上某些事件的 GitHub 应用程序 当这些事件之一被触发时 我们将向 Webhook 的配
  • 在谷歌电子表格中将单元格格式设置为分钟:秒

    我希望记录我完成某个编程问题所需的时间数据 我正在使用谷歌电子表格来保持我的表现 面临的问题是 我希望细胞接受结果mm ss 但谷歌表正在将其转换为12 hr格式即hh mm ss 我怎样才能阻止这种情况发生 例如 1 30被转换为凌晨 1
  • GO存储数据返回EOF

    我是 golang 新手 我正在尝试构建 Rest api 到目前为止 GET 端点对我来说工作得很好 但是我在使用 POST 方法 创建用户 时遇到了困难 这就是我的 User 结构的样子 type User struct ID uint
  • 处理失败的期货

    在 Play Framework 2 3 中 操作可以从成功的未来调用中产生结果 如下所示 def index Action async val futureInt scala concurrent Future intensiveComp
  • XPath 如何以名称空间不知道的方式识别谓词中的属性[重复]

    这个问题在这里已经有答案了 我有以下 XML 文件
  • 为数据库中的日期添加 30 天

    我在数据库中发布了更新日期和发布日期 目前它们的日期相同 我如何更改它 在 mysql 插入期间 以便发布日期比发布更新日期晚 30 天 我正在使用 pubDate Thanks 您可以使用日期添加 http dev mysql com d
  • PM2 Flush 不清除日志

    我运行的 Ubuntu 服务器突然满了 因为 pm2 日志占用了 16GB 我试过pm2 flush 但这只会清除占用 4GB 的文件夹 作为 root pm2 文件夹被清除 但日志文件夹未被清除 作为我自己的用户 该文件夹已被清除 但用户
  • 在Python中如何将`email.message.Message`对象转换为`email.message.EmailMessage`对象

    据我了解mboxPython 3 6 标准库中的类生成以下类型的旧式消息对象email message Message 较新的班级email message EmailMessage3 4 3 6 中引入的功能可以更轻松地访问消息内容 通过
  • 禁用 nginx 中的请求缓冲

    看起来 nginx 在将请求传递到上游服务器之前会缓冲请求 虽然对我来说大多数情况下都可以 但这是非常糟糕的 我的情况是这样的 我有 nginx 作为前端服务器来代理 3 个不同的服务器 apache 与典型的 php 应用程序 我用 py
  • lambda函数使用其参数作为模板参数调用模板函数

    以下是示例代码 无法编译 We use 迭代函数来迭代某个范围并运行 lambda 回调函数 这iterate函数将传递一些指示 即type 到回调 lambda 函数 然后该函数将根据指示进行工作 由于这些指示在编译时是固定的 我相信有一
  • Collection.stream() 的实现

    我已经在 J DK 1 8 上工作了几天 我遇到了一些与此类似的代码 List
  • 使用 ul li 生成 Jquery 多级菜单列表

    images vertical horizontal Jquery UI include quickfox 要处理的数组 我有像上面一样的文件夹结构 它存储在数组目录中 见下文 var dirs images images vertical
  • 如何在Vuejs中处理浏览器后退按钮单击事件

    在 Vue 组件中 我想像这样处理浏览器返回事件 mounted if browser back console log browser back button clicked else console log stay here 为了处理
  • 从 JSON 文件定义 Mongoose 模式

    我想从 JSON 文件定义我的猫鼬架构 这是我的 JSON 文件结构 default item productTitle label Product Title note e g Samsung GALAXY Note 4 type tex
  • Angular.js 观察函数调用的结果

    以下代码片段是否存在任何表面问题 ul class breadcrumb li class active span nbsp a href path dir url dir name a nbsp span class dividier s
  • 如何在 pythonpyder IDE 中使用相对导入

    我有 anaconda python 并正在使用spyder IDE 我试图弄清楚如何在运行底部或 F5 中使用相对导入 假设我有 pkg A foo1 py pkg A foo2 py 并且 foo1 py 有 from import f
  • 如何修复手机上的 Skrollr?

    我遵循移动浏览器支持指南 将内容包装在正文标记之后和之前 解释在这里 https github com Prinzhorn skrollr what you need in order to support mobile browsers
  • PHP Curl 和 setcookie 问题

    我有一个curl 脚本 充当客户端和主服务器之间的代理 field array array Accept gt HTTP ACCEPT Accept Charset gt HTTP ACCEPT CHARSET Accept Encodin
  • 在 Magento ORM 中使用布尔字段

    我正在为我的自定义实体开发后端编辑页面 我几乎一切都正常工作 包括保存一堆不同的文本字段 但是 当尝试设置布尔字段的值时 我遇到了问题 我努力了 landingPage gt setEnabled 1 landingPage gt setE
  • 在域模型之间映射数据的模式

    这是我最近需要做的一件常见的事情 我正在寻找任何常见的模式来使这变得更容易一些 这一切的主要要点是我有一些数据模型 它们被建模来满足 ORM 并纯粹对对象进行 CRUD 操作 这些模型目前通过存储库 工厂公开 取决于其 C 还是 RUD 然