为模型创建通用 Save() 方法

2024-01-10

我有一个相当简单的系统,出于这个问题的目的,基本上由三个部分组成:模型、存储库、应用程序代码。

核心是模型。让我们使用一个简单的例子:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

在同一个项目中有一个通用存储库接口。最简单的说:

public interface IRepository<T>
{
    T Save(T model);
}

该接口的实现位于一个单独的项目中,并使用 StructureMap 注入。为了简单起见:

public class PersonRepository : IRepository<Person>
{
    public Person Save(Person model)
    {
        throw new NotImplementedException("I got to the save method!");
        // In the repository methods I would interact with the database, or
        // potentially with some other service for data persistence.  For
        // now I'm just using LINQ to SQL to a single database, but in the
        // future there will be more databases, external services, etc. all
        // abstracted behind here.
    }
}

因此,在应用程序代码中,如果我想保存模型,我会这样做:

var rep = IoCFactory.Current.Container.GetInstance<IRepository<Person>>();
myPerson = rep.Save(myPerson);

很简单,但感觉它可以自动化很多。该模式在整个应用程序代码中都适用,因此我想要做的是创建一个通用的Save()在所有模型上,这只是对上述应用程序代码的简写调用。这样人们只需要调用:

myPerson.Save();

但我似乎无法找到一种方法来做到这一点。也许这很简单,只是我没有从正确的角度看待它。起初我尝试创建一个空的ISaveableModel<T>接口并打算让每个“可保存”模型实现它,然后对于单个通用Save()方法我会在界面上进行扩展:

public static void Save<T>(this ISaveableModel<T> model)
{
    var rep = IoCFactory.Current.Container.GetInstance<IRepository<T>>();
    model = rep.Save(model);
}

但它告诉我rep.Save(model)有无效参数。看起来它并没有像我希望的那样连接类型推断。我尝试了类似的方法BaseModel<T>模型将从中继承的类:

public class BaseModel<T>
{
    public void Save()
    {
        this = IoCFactory.Current.Container.GetInstance<IRepository<T>>().Save(this);
    }
}

但编译器错误是一样的。有没有办法实现我想要实现的目标?我对设计非常灵活,所以如果我在架构层面上遇到了一些错误,那么我有空间退后一步并改变大局。


通用扩展方法可以解决这个问题吗?

public static T Save<T>(this T current)
{
    var rep = IoCFactory.Current.Container.GetInstance<IRepository<T>>();
    rep.Save(current);
}

然后您可以将其限制为您的ISaveableModel<T>界面。上面的返回类型未实现,但您可以将其放入布尔值或状态标志,无论如何。

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

为模型创建通用 Save() 方法 的相关文章

  • 为什么 std::vector 可以处理类定义中的不完整类型?

    出现了以下问题 C 标准似乎说 std vector需要一个完整的类型才能工作 看https en cppreference com w cpp container vector https en cppreference com w cp
  • 如何使用C从http下载文件?

    最近几天我试图弄清楚如何从 URL 下载文件 这是我对套接字的第一个挑战 我用它来了解协议 所以我想在没有 cURL 库的情况下只用 C 语言来完成它 我搜索了很多 现在我可以打印页面的源代码 但我认为这与文件不同 我不必只将接收到的数据从
  • 如何使用不同的基本路径托管 Blazor WebAssembly 应用程序

    我有一个 Blazor Webassemble NET 托管应用程序 在我们托管它的服务器上 应用程序的基本路径将是mydomain com coolapp 因此 为了尝试让应用程序在服务器上正确呈现 我一直遵循本页 应用程序基本路径 部分
  • 未找到 DEADLINE 调度策略

    我想在 C 中实现 DEADLINE 调度策略 我知道该功能已实现Linux 3 14 10我正在使用 Ubuntu 14 04Linux 3 17 0 031700 lowlatency 201410060605 SMP PREEMPT这
  • C++中类成员函数相互调用有什么好处?

    我是 C 新手 我发现下面的编程风格对我来说很有趣 我在这里写了一个简化版本 include
  • CMake(Ninja 后端)使用 /MT 编译

    我有一个类似的问题CMake 使用 MT 而不是 MD 进行编译 https stackoverflow com questions 14172856 cmake compile with mt instead of md但有一些差异 我正
  • 是否可以创建一个在函数的泛型类型上具有特征边界的类型别名?

    这段代码 pub type Foo
  • Windows Phone 7 - ScrollViewer 值已更改

    我一直在寻找解决方案 但无法找到正确的解决方案 我的网格宽度为 960 并且有ScrollViewer在里面 现在我想知道滚动时滚动的值 水平偏移 我找到的所有解决方案都是针对 wpf silverlight 的 它对我不起作用 Edit
  • 自己绘制的WPF自定义滑块

    这是我关于堆栈溢出的第一个问题 所以不要踢它 我在尝试创建 Mac 风格的滑块控件时遇到问题 我已经发现这个解决方案 http www codeproject com KB miscctrl MAC Slider aspx我已经在我的解决方
  • 使用 STL 流时如何格式化我自己的对象?

    我想将我自己的对象输出到 STL 流 但具有自定义格式 我想出了这样的东西 但由于我之前从未使用过 locale 和 imbue 所以我不知道这是否有意义以及如何实现 MyFacet 和operator 所以我的问题是 这是否有意义以及如何
  • 当我尝试传递临时地址作为参数时,它是一个 UB 吗?

    对于以下 C 代码 include
  • 将 AutomationID 与 ListView 结合使用

    我正在尝试将 AutomationId 附加到列表视图中的项目 理想情况下 将项目名称绑定到显示的项目
  • 如何在VS2005中使用从.bat而不是.exe启动的外部程序进行调试?

    在我的 c 项目的调试属性中 我选择了 启动外部程序 并选择了我希望将调试器附加到的程序的 exe 但是 现在我需要从 bat 文件而不是 exe 启动程序 但 VS2005 似乎不允许这样做 这可能吗 编辑 为了澄清 我需要调试从 bat
  • 查找数组中的多个索引

    假设我有一个像这样的数组 string fruits watermelon apple apple kiwi pear banana 是否有一个内置函数可以让我查询 apple 的所有索引 例如 fruits FindAllIndex ap
  • 为什么存在系统调用

    我一直在阅读有关系统调用及其在 Linux 中如何工作的内容 我还有更多的阅读要做 但我读过的一件事都没有回答 那就是 为什么我们需要系统调用 我知道系统调用是用户空间程序要求内核执行某些操作的请求 但我的问题基本上是 为什么用户空间程序本
  • 使用通用存储库模式和流畅的 nHibernate

    我目前正在开发一个中型应用程序 它将访问不同站点上的 2 个或更多 SQL 数据库等 我正在考虑使用类似的东西 http mikehadlow blogspot com 2008 03 using irepository pattern w
  • 如何将模型绑定到动态创建的类 nancyfx

    首先感谢任何愿意查看我的问题的人 我对 Nancyfx 还很陌生 在尝试将 JSON 有效负载绑定到动态创建的类时遇到问题 我按照这篇文章中的代码动态创建了该类 在C 中动态创建一个类 https stackoverflow com que
  • 将同步 zip 操作转换为异步

    我们有一个现有的库 其中一些方法需要转换为异步方法 但是我不确定如何使用以下方法执行此操作 错误处理已被删除 该方法的目的是压缩文件并将其保存到磁盘 请注意 zip 类不公开任何异步方法 public static bool ZipAndS
  • NHibernate:无状态会话错误消息无法获取代理

    我正在使用 nHibernate 无状态会话来获取对象 更新一个属性并将对象保存回数据库 我不断收到错误消息 无状态会话无法获取代理 我在其他地方有类似的代码 所以我不明白为什么这不起作用 有谁知道问题可能是什么 我正在尝试更新Screen
  • 如何使用 Microsoft Graph API 更新 MailboxSettings

    我想从不同的日历更新邮箱设置 如何构建可以通过 Microsoft Graph 更新 MailboxSetting 的请求 这是我的代码示例 但有例外 代码示例 User obj GraphServiceClient Users roomC

随机推荐

  • UIStackview 左对齐

    我试图将 UIStackview 中的项目水平向左对齐 有没有办法以编程方式执行此操作 我尝试通过故事板来做到这一点 但没有成功 由于某种原因 UIStackView 中的项目会自行居中 如果您使用 StackView 将 axis 属性设
  • ASP.Net 应用程序作为 IIS_USR 执行 powershell 脚本

    我正在构建一个 asp net mvc 应用程序 它将作为我们编写的许多 powershell 脚本的包装器来运行 以管理日常任务 最终目标是让非技术人员轻松使用这些脚本 我已经设法让脚本很好地执行 var ctx System Web H
  • 用C++实现二阶低通滤波器,如何计算系数?

    我正在努力寻找合适的算法来生成低通滤波器的系数 我写了以下内容butterworthLowPass代码来自another https stackoverflow com a 20932062 2612235那么问题 class Filter
  • DialogFragment 已触发,但未显示导航架构组件中的布局

    在我的一个应用程序中 我使用 Android 导航架构组件 一切都很顺利 但当我想导航到 DialogFrgment 时 我陷入了困境 虽然触发了DialogFragment 但没有看到布局 只能看到重叠模糊背景 无法弄清楚实际问题 这是我
  • 如何使用 nvm-windows 同时运行两个不同的节点版本?

    问题 我们需要在两个不同的应用程序上同时运行和使用两个不同的节点版本 即 14 12 以支持使用 npm run dev npm install具有相应定义版本的命令 到目前为止我们尝试过的步骤 Created nvmrc每个应用程序上定义
  • 有关从一台设备到另一台设备的 Android 内核移植的指南

    我拥有一台 Samsung Galaxy 3 并且想要移植可用于其他 Android 设备的内核 我已经准备好了所有的建筑环境 我也有C知识 我到底不明白的是移植涉及什么以及如何以及什么 哪些代码应该以什么方式修改 如果有人可以帮助我 这会
  • 对象不继承原型函数

    我有一个构造函数 它充当超类 Bla function a this a a 我将其原型化为包含一个简单的方法 Bla prototype f function console log f 现在新的Bla 1 f 将在控制台中记录 f 但是
  • Pytorch 无法将训练好的模型导出为 ONNX

    我一直在使用多个卷积层 3x3 步长 1 填充相同 在 Pytorch 框架中训练模型 该模型表现良好 我想在 Matlab 中使用它进行推理 为此 框架之间的 NN 交换的 ONNX 格式似乎是 唯一的 解决方案 可以使用以下命令导出模型
  • 使用什么机器实例在 Google Cloud Platform 中运行 GPU 工作负载 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在尝试运行 Elasticsearch BERT 应用程序 并想了解使用 GPU 微调模型的最小配置 我应该使用什么机器配置 参考githu
  • C++ 操作符删除失败,如果不能,为什么?

    在内存解除分配期间 操作符删除是否可以抛出异常或以其他方式发出错误信号 以其他方式是否有可能operator delete失败 在这种情况下它的默认行为是什么 ISO 标准对此有何规定 例如在 Windows 操作系统中 C operato
  • SASS:生成的 CSS 不是最佳的

    我正在努力学习SASS 我让这个代码片段工作了 但在我看来生成的 css 很糟糕 我希望所有这些 css 都放在同一个 container 中 没有三个不同 如下所示 SASS container extend clearfix exten
  • 如何检查 json 中的所有键是否都等于 true

    如何检查 json 对象中的所有键是否都等于 true 我的对象看起来像这样 success first name false middle name false last name false d o b false sex false
  • ansible、命令模块和带管道的 jq

    我正在尝试运行一个返回容器列表及其大小的 docker 命令 命令是docker container ls format name Names size Size all jq slurp 当我尝试在 Ansible 剧本中运行它时 它会爆
  • SSIS 导入 Excel 日期时出错(截断错误)

    我很抱歉发布了一个看似非常简单的问题 但我找不到答案 而且我浪费了几天 此时不仅仅是几个小时 我对 SSIS 还很陌生 它只是让我感到不舒服 背景 非常简单的 SSIS 包 用于将 Excel 工作表导入 SQL Server 中的临时表
  • 使用Python获取视频属性,无需调用外部软件

    更新 是的 有可能 现在大约 20 个月后了 请参阅下面的更新3 更新 这真的不可能吗 我能找到的只是调用 FFmpeg 或其他软件 的变体 我当前的解决方案如下所示 但我真正想要的可移植性是一个仅 Python 的解决方案 不需要用户安装
  • 如何在Python ElementTree中插入子子元素

    我的 XML
  • 单个 MSI 安装正确的 32 或 64 位 C# 应用程序

    我有一个为 x86 32 位 和 x64 64 位 平台构建的 C 应用程序 我的构建系统当前输出 两个 MSI 安装程序 每个平台一个 为了以防万一 我的 C 应用程序包含一个 Windows 任务栏工具栏 这意味着安装的 DLL 必须由
  • CoInitializeEx 用于 boost::test::unit_test

    有一天 我决定需要了解 Windows 平台上的 C 测试驱动开发 使用 Visual Studio 2010 Premium 在决定尝试 boost 的单元测试框架之前 我环顾四周 我应该说我选择了 boostpro com 的版本 如果
  • 如何使用Python多进程apply_async获得精确的超时?

    我正在使用多进程池并行运行一批作业 我想给每项工作2秒的时间限制 也就是说 如果一项工作花费的时间超过 2 秒 我想终止该工作并继续执行下一项工作 这是我的代码 from multiprocessing import Pool Timeou
  • 为模型创建通用 Save() 方法

    我有一个相当简单的系统 出于这个问题的目的 基本上由三个部分组成 模型 存储库 应用程序代码 核心是模型 让我们使用一个简单的例子 public class Person public string FirstName get set pu