为模型创建通用 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() 方法 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li

随机推荐

  • 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