使用 ServiceStack.ORMLite 实现工作单元和存储库模式的最佳实践

2023-11-24

假设有两个存储库接口:

interface IFooRepository
{
    void Delete(int id);
}

interface IBarRepository
{
    void Delete(int id);
}

以及工作单元界面,例如:

interface IUnitOfWork : IDisposable
{
    void Commit();
    void Rollback();
}

使用 ServiceStack.ORMLite 实现这些接口的最佳实践是什么,以便用户可以像这样使用它们

MyFooRepository.Delete(4);
// if an Exception throws here, Bar won't be deleted
MyBarRepository.Delete(7);

Or

using (var uow = CreateUnitOfWork())
{
    MyFooRepository.Delete(4);
    MyBarRepository.Delete(7);
    uow.Commit();  //now they are in an transaction
}

不确定您是否需要 Repository + UnitOfWork 模式,但我认为 ServiceStack + OrmLite 中有一些替代解决方案,可以在您需要引入任何模式之前保持代码“干燥”(特别是如果您主要寻求事务/回滚支持)。我将从如下开始。

public class Foo //POCO for data access
{
    //Add Attributes for Ormlite
    public int Id { get; set;  }
}

public class Bar //POCO for data access
{
    //Add Attributes for Ormlite
    public int Id { get; set; }
}

//your request class which is passed to your service
public class DeleteById 
{
    public int Id { get; set; }
}

public class FooBarService : MyServiceBase //MyServiceBase has resusable method for handling transactions. 
{
    public object Post(DeleteById request)
    {
        DbExec(dbConn =>
                   {
                       dbConn.DeleteById<Foo>(request.Id);
                       dbConn.DeleteById<Bar>(request.Id);
                   });

        return null;
    }
}

public class MyServiceBase : Service
{
    public IDbConnectionFactory DbFactory { get; set; }

    protected void DbExec(Action<IDbConnection> actions)
    {
        using (var dbConn = DbFactory.OpenDbConnection())
        {
            using (var trans = dbConn.OpenTransaction())
            {
                try
                {
                    actions(dbConn);
                    trans.Commit();
                }
                catch (Exception ex)
                {
                    trans.Rollback();
                    throw ex;
                }
            }
        }
    }
} 

一些参考...

https://github.com/ServiceStack/ServiceStack.RedisWebServices- 上面的代码是根据这个例子修改的

https://groups.google.com/forum/#!msg/servicestack/1pA41E33QII/R-trWwzYgjEJ- 关于ServiceStack中各层的讨论

http://ayende.com/blog/3955/repository-is-the-new-singleton- Ayende Rahien(NHibernate 核心贡献者)关于存储库模式

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

使用 ServiceStack.ORMLite 实现工作单元和存储库模式的最佳实践 的相关文章

  • 我需要一些关于 MVC 架构和三层架构的澄清

    我一直在读 Pro ASP NET MVC Framework 一书 我对很多事情感到非常困惑 我一直在尝试做一些研究 但我发现有这么多不同的方法和概念向我抛出 这只会让事情变得更糟 所以我有几个问题 我知道 MVC 应该将功能分为三个主要
  • 使用 ServiceStack.Text 序列化 ExpandoObject

    我正在尝试使用库序列化对象ServiceStack Text https github com ServiceStack ServiceStack Text 这有效 using System Dynamic using ServiceSta
  • 如何创建通用存储库?

    我想知道是否有人有关于制作通用存储库的任何好的教程 或者甚至可能是已经制作好的并且有详细记录的库 我当前正在使用 linq to sql 但它可能会发生变化 所以我不知道您是否可以创建一个通用存储库 如果我说切换到实体框架 则几乎不需要任何
  • 记录 ServiceStack Web 服务 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 用于记录基于 ServiceStack 的 Web 服务的选项有哪些 我不是在谈论单行字符串 我希望能够详细记录 可能很长 返回类型
  • “会议结束!” -NHibernate

    这是在 Web 应用程序环境中 初始请求能够成功完成 但是任何其他请求都会从 NHibernate 框架返回 会话已关闭 响应 我使用 HttpModule 方法和以下代码 public class MyHttpModule IHttpMo
  • ServiceStack.DataAnnotations 缺少属性定义?

    我正在尝试使用 ServiceStack DataAnnotations 中的 ServiceStack 属性装饰器 但是当我在 MSVS 对象浏览器中查看 ServiceStack DataAnnotations 命名空间时 只有以下类型
  • 让 ServiceStack 保留类型信息

    我正在使用 ServiceStack 将一些对象序列化和反序列化为 JSON 考虑这个例子 public class Container public Animal Animal get set public class Animal pu
  • 当代码并非所有部分都是异步时,异步 Web 服务有什么好处

    我想知道如果代码并非所有部分都是异步的 那么使用异步 http 请求会带来多少好处 让我们考虑以下场景 1 异步 http 请求阻塞同步数据库调用 2 同步 http 请求等待异步数据库调用 1 Web Api 支持异步操作方法 但是如果我
  • 如何在实体框架中重用投影?

    我有一个 ASP NET MVC 应用程序 它使用实体框架来获取数据 我需要将实体转换为模型 然后再将它们传递给视图 预测可能非常复杂 但为了保持简单 public static IQueryable
  • System.IO.IOException:打开的文件太多

    在 Mac OS X 上调试 ServiceStack Web 应用程序时 我间歇性地收到此错误 我似乎无法确定它是什么 我尝试使用以下命令杀死 xamarin Web 服务器 ps aux grep xsp4 grep v grep aw
  • 如何在 servicestack.net 中实现身份验证

    我正在调查 servicestack net 但它的示例和文章似乎没有涵盖身份验证 这是由 servicestack net 处理的东西 如果是的话如何处理 我特别有兴趣实现对以下方面的支持 OAuth 因此能够检查原始请求并验证它 检索关
  • 是否可以将 ServiceStack.Text.JsConfig 设置范围限制为您的库?

    我正在编写一个使用的自定义库ServiceStack Text https github com ServiceStack ServiceStack Text内部 使用我的其他库也可能使用 ServiceStack Text 我想改变一些J
  • 通用存储库是否需要一个基实体类才能在任何地方应用?

    我正在使用 ASP NET MVC 创建一个 Intranet 网站洋葱架构 我一直在实现存储库模式 但遇到了困难 假设我有一个包含 IDDocument 的文档表 那么这是我的存储库 只有一种方法 class Repository
  • NSubstitute 不匹配 Linq 表达式

    我正在实现一个存储库模式查询类并使用 NSubstitute 进行测试 存储库接口 public interface IMyRepository IQueryable
  • ServiceStack 验证并不总是触发

    因此 我尝试使用 RavenDB 和 ServiceStack 构建端到端集成测试套件 但遇到了一个非常奇怪的问题 即验证无法对某些请求运行 这真的很奇怪 我不确定我做错了什么 我正在使用 NCrunch 有时测试通过 有时失败 希望这是一
  • 如何从 VS2013 为基于 ADO.Net 的存储库编写单元测试代码

    我在单元测试领域很新 那么请指导我如何在控制器内为基于 ADO Net 的存储库和操作方法编写单元测试 我将使用 VS 自己的单元测试框架 所以请看代码并告诉我哪些类和函数需要经过单元测试 如果有人告诉我哪些区域需要单元测试以及哪些区域不需
  • 实体框架服务层更新 POCO

    我正在使用Service Layer gt Repository gt Entity Framework Code First w POCO objects方法 我在更新实体方面遇到了困难 我正在使用 AutoMapper 将域对象映射到视
  • 在 ServiceStack.OrmLite 中多次加入同一个表

    将表与其自身连接时 生成的 sql 语句未正确引用表 当 主 表与连接表不同时它起作用https github com ServiceStack ServiceStack OrmLite join aliases https github
  • IdentityServer3 与 ServiceStack 和 MVC 客户端

    我是 IdentityServer3 的新手 刚刚开始设置它 似乎进展顺利 我一直在为 MVC 应用程序开发混合流程 类似于 Kevin Dockx 的 Pluralsight 课程中所示的内容 http www pluralsight c
  • 如何在此 MSDN 示例中使用 Order By

    我正在尝试弄清楚如何使用这个 orderBy 参数 我不确定我应该传递什么 http www asp net mvc tutorials getting started with ef using mvc implementing the

随机推荐

  • 在控制器中执行操作的 Rails 3 链接或按钮

    在 RoR 3 中 我只想有一个链接 按钮来激活控制器中的某些操作 方法 具体来说 如果我单击页面上的 update specs 链接 它应该转到我的产品控制器中的 update specs 方法 我在此网站上找到了执行此操作的建议 lin
  • 如何比较一个字符来检查它是否为空?

    我尝试了下面的方法 但是 Eclipse 抛出了一个错误 while s charAt j null 检查字符是否是的正确方法是什么null 检查是否String s is not null在进行任何字符检查之前 返回的字符String c
  • 学说迁移,使用自定义学说类型的问题

    我正在使用 Symfony2 Doctrine2 构建一个应用程序 我的应用程序需要存储地理空间数据 因此我编写了适当的学说扩展 一切都运行得很好 并且该应用程序已经在生产环境中运行了很长时间 现在我必须添加一些新功能 并且需要更新数据库而
  • MVC DateTime 验证 - 英国日期格式

    我有一个简单的视图 其中包含两个日期字段 并添加了 ValidationMessageFor 控件以进行不显眼的 JavaScript 验证 我的问题是 当格式正确时 dd MM yyyy 我总是被告知我的日期无效 我已经添加了
  • IIS7 - 在 ASP 中指定内容长度标头会导致“连接重置”错误

    我正在将一系列网站从现有的 IIS5 服务器迁移到全新的 IIS7 Web 服务器 其中一个页面从数据库中的 blob 中提取数据文件并将其提供给最终用户 Response ContentType rs contentType Respon
  • 可以使用 Fetch API 作为请求拦截器吗?

    我尝试在每次使用 Fetch API 向服务器发出请求后运行一些简单的 JS 函数 我已经搜索过这个问题的答案 但没有找到任何答案 可能是因为 Fetch API 相对较新 我一直在这样做XMLHttpRequest像这样 function
  • 如何将准备好的语句与 PHP 事务结合使用?

    我的目标是同时使用事务和准备好的语句 以实现数据完整性和防止 SQL 注入 我有这个 try cnx new PDO dsn dbuser dbpass cnx gt setAttribute PDO ATTR ERRMODE PDO ER
  • 对象属性赋值与解构?

    我想用ES6 解构分配对象的属性 但无法弄清楚语法 var dst already in existence with its own props methods etc var src a foo b bar c baz dst a sr
  • 图像变换会产生红色图像?

    我正在尝试通过水平翻转图像并调整其大小来转换图像 问题是 当转换完成后 图片的颜色都很奇怪 它已经变成了微红色调 是否有可能以某种方式解决这个问题 我想我在某处读到这可能是 AWT 库中的一些错误 但我不确定 这是代码 import jav
  • 模板内类型名分配的目的是什么

    我遇到过这段代码 我试图包含所有详细信息 以防我遗漏某些内容 template lt typename TYPE TYPE with an arbitrarily long name typename KIND KIND with an a
  • 斯康斯。使用 Glob 进行递归

    我使用 scons 几天了 有点困惑 为什么没有内置工具用于从给定根开始递归构建源 让我解释 我有这样的源码配置 src Core folder1 folder2 subfolder2 1 Std folder1 等等 这棵树可能更深 现在
  • mysql 中的文本索引与整数索引

    无论如何 我一直尝试在表上使用整数主键 但现在我怀疑这是否总是必要的 假设我有一个产品表 每个产品都有一个全球唯一的 SKU 编号 这将是一串 8 16 个字符的字符串 为什么不把这个作为PK呢 通常 我会将此字段设为唯一索引 但随后使用自
  • 在php中调整图像的透明度

    我已经仔细研究了在调整 png 大小时如何正确管理 alpha 我设法让它保持透明度 但仅限于完全透明的像素 这是我的代码 src image imagecreatefrompng file dir this gt file name ds
  • C++20 中的指定初始值设定项

    我有一个关于 c 20 功能之一的问题 指定初始化程序 有关此功能的更多信息here include
  • 请求在 v2.3 API 中获取 Facebook 页面点赞总数

    以前我为此使用 FQL 但从 v2 1 开始已弃用 我将使用图形边缘 likes 转向 v2 3 这是我的网址 https graph facebook com v2 3
  • 如何根据标签更改 Chart.js 点的颜色

    我有一个 Chart js 折线图 其中标签是星期几 我想根据具体日期 周一至周日 更改点背景 我可以根据数据值更改背景颜色 但这不是我需要的 相反 我想给每一天 标签 一个不同的色点 例如 这就是我如何根据数据值更改点 不是我需要的 ch
  • 带有 EduTools 插件的 Kotlin Koans:“无法启动检查”

    我正在尝试遵循科特林公案Android Studio 中的教程安装 EduTools 插件 and 选择 Kotlin Koans 课程 一切正常 但是当我尝试时 检查任务 in the 任务描述面板 我收到此错误 启动检查失败 我也尝试了
  • 覆盖功能

    我正在学习一所著名大学提供的 iOS 在线课程 我不明白为什么使用以下代码override这是合法的 根据官方定义 我们使用override重写超类的方法 下面代码中的子类和超类在哪里 什么被覆盖以及被什么覆盖 public overrid
  • 使用 cv::Mat 进行高效的 C++ 四元数乘法

    我想乘以 2 个四元数 它们存储在cv Mat结构 我希望该功能尽可能高效 到目前为止我有以下代码 Quaternion multiplication void multiplyQuaternion const Mat q1 const M
  • 使用 ServiceStack.ORMLite 实现工作单元和存储库模式的最佳实践

    假设有两个存储库接口 interface IFooRepository void Delete int id interface IBarRepository void Delete int id 以及工作单元界面 例如 interface