使用 ServiceStack.ORMLite 的存储库模式中的事务

2023-12-27

我正在使用 ServiceStack.ORMLite 实现存储库模式,如下所示:

public class MyRepository : IMyRepository
{
    private IDbConnectionFactory DbConnectionFactory = null;

    public MyRepository(IDbConnectionFactory dbConnectionFactory)
    {
        DbConnectionFactory = dbConnectionFactory;
    }

    public void MyMethod()
    {
        using (var connection = DbConnectionFactory.OpenDbConnection())
        using (var cmd = connection.CreateCommand())
        {
            //Do something here
        }
    }
}

但当我需要在 DbTransaction 中扭曲某些数据库操作时,我不知道如何处理 DbTransaction。它看起来像TransactionScope http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx是一个解决方案,但我不知道是否太重了。


ServiceStack OrmLite https://github.com/ServiceStack/ServiceStack.OrmLite/使您可以访问 ADO.NET 的原始数据IDbConnection and IDbTransaction您应该使用的类而不是 TransactionScope 的类。您可以使用以下命令创建交易IDbConnection.OpenTransaction()扩展方法,例如:

public class MyRepository : IMyRepository, IDisposable
{
    private IDbConnectionFactory DbFactory { get; set; }

    private IDbConnection db;
    private IDbConnection Db
    {
        get { return db ?? (db = dbFactory.Open()); }
    }

    public void WithTransactions()
    {
        using (var trans = Db.OpenTransaction())
        {
            //Do something here

            trans.Commit();
        }
    }

    public List<Poco> WithoutTransactions()
    {
        return Db.Select<Poco>();
    }

    public void Dispose()
    {
        if (db != null) 
            db.Dispose();
    }
}

因为它需要更少的代码,所以我更喜欢属性注入并使用 LazyDb属性来简化我的方法的数据访问模式。

注意:每当您的任何类保留对开放的引用时IDbConnection(像这个),它应该注册无/瞬态 or 请求范围因此连接在使用后会被释放(即不要将其注册为单例)。

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

使用 ServiceStack.ORMLite 的存储库模式中的事务 的相关文章

随机推荐

  • StackTrace 构造函数和获取方法名称对性能的影响

    我的日志库中有这段代码 var stackTrace new StackTrace string operationName stackTrace GetFrame 1 GetMethod Name 根据我使用 PerfView 工具进行的
  • PHP 警告:113 字节的 POST 内容长度超出了未知中 -1988100096 字节的限制

    用户在我的网站上上传图像时遇到很多问题 他们最多可以上传 6 张图片 最初我必须将 php ini 中的值更改为 upload max filesize 2000M post max size 2000M max execution tim
  • 如何使用最小起订量来测试 MongoDB 服务层?

    我的应用程序和 mongo 数据库之间有一个服务层 我正在尝试使用最小起订量构建单元测试 我对最小起订量很陌生 所以我从我认为是一个微不足道的测试开始 要测试的代码 public List
  • Angular - 如何导入 googleapis 库?

    我正在尝试将 Google Drive API 合并到我的一个项目中 Node js快速入门指南 https developers google com drive api v3 quickstart nodejs要求我导入文件读取和 go
  • 是否存在无法避免 lambda 中的尾随返回类型语法的情况?

    关于之前的问题 是否可以通过 lambda 引用返回 T 类型的对象 而不使用尾随返回类型语法 q 40977730 我想知道是否还有其他重要的案例或例子尾随返回类型语法 当使用 lambda 时 可以not应避免 在 C 14 中 一个有
  • 在 MATLAB 中将 repmat 替换为 bsxfun

    在下面的函数中 我想进行一些更改以使其更快 它本身很快 但我必须在 for 循环中多次使用它 所以需要很长时间 我想如果我用 bsxfun 替换 repmat 会使其更快 但我不确定 我该如何进行这些替换 function out lagc
  • 当 onCreate 中完成 Activity 时,我的 Fragment 的 onCreateView 在 onCreate 之前如何被调用?

    这很奇怪 我有一个简单的应用程序 登录后会显示活动中的片段 该应用程序还有一个不活动的 超时 在此时间后它会完成活动并显示登录屏幕 如果应用程序在超时发生时处于后台 那么当下一次超时时onCreate or onStart事件发生在它完成的
  • 在哪里可以找到 FCM Firebase 注册 ID(在 PHP 中,对于 Ionic 框架)?

    我们已经使用 Ionic 框架构建了一个应用程序 我们是 Ionic 等的初学者 并将设备注册到我们的 Firebase 帐户 以便我们可以发送推送消息 我现在找到了一个通过 cURL 连接到 fcm 的 PHP 片段 我可以设置消息和标题
  • 实现阶乘函数时出现“所有控制路径递归”错误

    对于课堂 我有一个作业 编写一个 C 程序 输出您可以选择的不同方式的数量k一组中的对象n对象 两者n and k应为正整数 该数字由以下公式给出 C n k n k n k 您的程序应该使用两个返回值的函数 第一个应该叫factorial
  • 为什么来自类的java字节码出现新静态内部类的代码出现jvm指令ACONST_NULL

    我尝试新建一个内部静态类 但我发现字节码出现了jvm指令ACONST NULL bwteen NEW DUP and INVOKE SPECIAL 但我知道一门新课是 NEW DUP 调用 特殊 package com hoho api a
  • 自定义 Jackson 对象映射器

    我有一个用例 需要维护两组 JSON 输出 一组具有漂亮的 JSON 属性名称 另一组没有 因此 我决定自定义 ObjectMapper 以便它忽略字段上的 JsonProperty pretty name 注释并使用字段属性名称 在这种情
  • SQL内联if语句类型问题

    我想做一个 MS SQL 查询 返回如下内容 Col1 Col2 Col3 AAA 18 92 18 92 BBB 20 00 40 00 AAA 30 84 30 84 BBB 06 00 12 00 AAA 30 84 30 84 AA
  • 在服务器端java类中读取客户端时区

    我有一个客户端程序 它将时间发送到服务器端程序 我正在使用 Callendar 对象将时间值从客户端传递到服务器 我的客户端程序位于斯里兰卡 服务器位于英国 当我在客户端发送时间 例如 2011 11 21T12 43 41 352 05
  • 如何读取UTF-8的InputStream?

    欢迎大家 我正在开发一个 Java 应用程序 它从互联网调用 PHP 它给我一个 XML 响应 响应中包含这个词 Pr ximo 但是当我解析 XML 的节点并将响应获取到字符串变量中时 我收到这样的词 Pr ximo 我确信问题是我在 J
  • 如何绑定到“MvxLinearLayout”的“ItemClick”?

    我有一个ScrollView最初包裹着两个MvxListView控制 Having ListView控制在一个ScrollView不过 Android 不支持 这是有道理的 因为它们都尝试填充父高度并提供自己的滚动逻辑 我想要的是两个不可滚
  • 使用核心数据实现枚举的最佳方法

    将核心数据实体绑定到枚举值以便我能够为实体分配类型属性的最佳方法是什么 换句话说 我有一个名为Item与itemType我想要绑定到枚举的属性 最好的方法是什么 如果您想将值限制为枚举 则必须创建自定义访问器 因此 首先您需要声明一个枚举
  • 在 C++ 中使用友元函数

    刚刚阅读了有关友元函数的内容 我正在尝试使用 B 类中的友元函数 Print 访问 A 类中的私有变量 number 我正在使用 Visual Studio 我的代码的编译给了我很多不同的错误 例如 C2011 A class 类型重新定义
  • 无法访问作业跟踪器的 hadoop web ui [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • 在 javascript 的 google 地图 api 中显示楼层选择器

    当使用 Android 或 iOS 版 Google 地图 API 时 似乎默认启用室内地图 并且当您放大具有室内地图的建筑物时 楼层选择器 控件会自动出现 如何在 Google Maps API for javascript 中获得类似的
  • 使用 ServiceStack.ORMLite 的存储库模式中的事务

    我正在使用 ServiceStack ORMLite 实现存储库模式 如下所示 public class MyRepository IMyRepository private IDbConnectionFactory DbConnectio