mongodb 和 C# 中的工作单元

2024-01-09

我知道 MongoDB 不应该支持工作单元等。但我认为实现仅存储意图(类似于标准)然后将它们提交到数据库的存储库会很好。否则,在存储库中的每个方法中,您都必须创建与数据库的连接,然后将其关闭。如果我们将与数据库的连接放置在某个 BaseRepository 类中,那么我们将存储库绑定到具体的数据库,并且测试存储库、测试解析存储库的 IoC 确实很困难。

在 MongoDB 中创建会话是一个坏主意吗?有没有办法将连接逻辑与存储库分开?

这是 Rob Conery 编写的一些代码。每次请求时始终连接到数据库是个好主意吗?最佳实践是什么?

还有一件事。想象一下我想为一个集合提供一个索引。以前我在构造函数中做过,但按照 Rob 的方法,在那里这样做似乎不符合逻辑。

 using Norm;
    using Norm.Responses;
    using Norm.Collections;
    using Norm.Linq;

    public class MongoSession {

        private string _connectionString;

        public MongoSession() {
            //set this connection as you need. This is left here as an example, but you could, if you wanted,
            _connectionString = "mongodb://127.0.0.1/MyDatabase?strict=false";
        }

        public void Delete<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression) where T : class, new() {
            //not efficient, NoRM should do this in a way that sends a single command to MongoDB.
            var items = All<T>().Where(expression);
            foreach (T item in items) {
                Delete(item);
            }
        }

        public void Delete<T>(T item) where T : class, new() {
            using(var db = Mongo.Create(_connectionString))
            {
              db.Database.GetCollection<T>().Delete(item);
            }
        }

        public void DeleteAll<T>() where T : class, new() {
            using(var db = Mongo.Create(_connectionString))
            {
              db.Database.DropCollection(typeof(T).Name);
            }
        }

        public T Single<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression) where T : class, new() {
            T retval = default(T);
            using(var db = Mongo.Create(_connectionString))
            {
              retval = db.GetCollection<T>().AsQueryable()
                         .Where(expression).SingleOrDefault();
            }
            return retval;
        }

        public IQueryable<T> All<T>() where T : class, new() {
            //don't keep this longer than you need it.
            var db = Mongo.Create(_connectionString);
            return db.GetCollection<T>().AsQueryable();
        }

        public void Add<T>(T item) where T : class, new() {
            using(var db = Mongo.Create(_connectionString))
            {
              db.GetCollection<T>().Insert(item);
            }
        }

        public void Add<T>(IEnumerable<T> items) where T : class, new() {
            //this is WAY faster than doing single inserts.
            using(var db = Mongo.Create(_connectionString))
            {
              db.GetCollection<T>().Insert(items);
            }
        }

        public void Update<T>(T item) where T : class, new() {
            using(var db = Mongo.Create(_connectionString))
            {
              db.GetCollection<T>().UpdateOne(item, item);
            }
        }

        //this is just some sugar if you need it.
        public T MapReduce<T>(string map, string reduce) {
            T result = default(T);
            using(var db = Mongo.Create(_connectionString))
            {
            var mr = db.Database.CreateMapReduce();
            MapReduceResponse response =
                mr.Execute(new MapReduceOptions(typeof(T).Name) {
                    Map = map,
                    Reduce = reduce
                });
            MongoCollection<MapReduceResult<T>> coll = response.GetCollection<MapReduceResult<T>>();
            MapReduceResult<T> r = coll.Find().FirstOrDefault();
            result = r.Value;
            }
            return result;
        }

        public void Dispose() {
            _server.Dispose();
        }
    }

不要太担心打开和关闭连接。 MongoDB C# 驱动程序维护一个内部连接池,因此每次创建新连接时,您都不会遭受打开和关闭实际连接的开销MongoServer object.

您可以创建一个公开数据逻辑的存储库接口,并构建一个在需要时注入的 MongoDB 实现。这样,MongoDB 特定的连接代码就会从您的应用程序中抽象出来,该应用程序只能看到 IRepository。

尝试使用 MongoDB 实现工作单元类型模式时要小心。与 SQL Server 不同,您不能在一个事务中登记多个查询,如果其中一个查询失败则可以回滚。

有关具有 MongoDB、SQL Server 和 JSON 实现的存储库模式的简单示例,请查看Nblog存储代码 https://github.com/ChrisFulstow/NBlog/tree/master/NBlog.Web/Application/Storage。它用Autofac http://code.google.com/p/autofac/IoC 将具体存储库注入 ASP.NET MVC 应用程序。

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

mongodb 和 C# 中的工作单元 的相关文章

  • C# 中的 Culture 相当于 Java 中的 Locale 吗?

    C 使用文化的概念 这在操作上与 Java 中的 Locale 类似吗 或者底层概念是否存在显着差异 从文化而不是语言环境的角度进行工作是一种寻找正确抽象层次的尝试 从以类似方式做事的人群的角度来考虑事物 而不是谈论地理区域和语言 并有点疯
  • HttpResponseMessage 的内容为 JSON

    我有一个 ASP NET MVC WEB API 由于多种原因 由于没有授权而重定向 我不能只使用一个简单的对象并在我的控制器方法中返回它 因此我需要 HttpResponseMessage 类来允许我重定向 目前我正在这样做 var re
  • 使用 QTextCursor 选择一段文本

    使用 Qt 框架选择文本片段时遇到问题 例如 如果我有这个文件 没有时间休息 我想选择 ime for r 并从文档中删除这段文本 我应该如何使用 QTextCursor 来做到这一点 这是我的代码 QTextCursor cursor n
  • ZedGraph 缩放和调整大小

    当我绘制图形 放大和缩小并重新绘制图形时 图形的位置不会改变 我想要做的是 每当重新绘制数据时 视图都会更改以查看所有图形数据 如果您在重绘之前放大或缩小 这似乎会被禁用 Thanks 设置属性 IsZoomOnMouseCenter对于控
  • C++17 中带有 noexcept 的 std::function

    在 C 17 中noexcept 已添加到类型系统中 http www open std org jtc1 sc22 wg21 docs papers 2015 p0012r1 html void r1 void f noexcept f
  • 如何获取任意类型的默认值

    在 C 中我可以写这样的东西 class AnyThing
  • 按位非运算符

    为什么要按位运算 0 打印 1 在二进制中 不是0应该是1 为什么 你实际上很接近 在二进制中 不是0应该是1 是的 当我们谈论一位时 这是绝对正确的 然而 一个int其值为0的实际上是32位全零 将所有 32 个 0 反转为 32 个 1
  • 在 DefaultHttpContext 上使用 FeatureCollection 时,响应对象为 null

    我正在测试一些 net Core 中间件 并希望使用整个 asp net Core http 管道来运行中间件 而不是模拟它 问题是 当我使用特征集合时 不知何故 响应对象没有在 httpRequest 中设置 并且它在请求本身上是只读的
  • 有哪些 API 可在 Windows 中使用 C# 配置扬声器设置?

    我环顾了很多不同的地方 但似乎找不到一个简单的方法来做到这一点 我在 Windows 7 中有多个声卡 并使用 HDMI 将声音输出到我的 AVR 放大器 我遇到的问题是 当放大器关闭时 它会导致窗口丢失扬声器配置 所以我想做的是编写一个小
  • 整数与双精度算术性能?

    我正在编写一个 C 类来使用整数执行 2D 可分离卷积 以获得比双对应更好的性能 问题是我没有获得真正的性能提升 这是 X 过滤器代码 对于 int 和 double 情况都有效 foreach pixel int value 0 for
  • 让 GCC/Clang 使用 CMOV

    我有一个简单的标记值联合 这些值可以是int64 ts or doubles 我正在对这些联合进行加法 但需要注意的是 如果两个参数都代表int64 t值 那么结果也应该有一个int64 t value 这是代码 include
  • C# Linq 可以做组合数学吗?

    我有这个数据结构 class Product public string Name get set public int Count get set var list new List
  • 一些涉及类析构函数和删除运算符的内存管理问题?

    在阅读了一些教程后 我仍然不清楚 C 中内存管理的一些观点 1 当使用 new 运算符声明的类超出范围时 是否会调用其析构函数并释放内存 是否有必要调用删除运算符来释放类的内存并调用其析构函数 class Test void newTest
  • 如何在 C# 中通过 JavaScript 回调运行 QUnit 测试并获取测试结果?

    在我的几个项目中 我使用 MVC 模式将代码 关注点 分为 3 层 模型层和控制层都在 C 上运行 因此我使用 MSTest 或 NUnit 等测试框架来验证这些层的功能需求 对于视图层 我使用 QUnit 来测试 JavaScript 文
  • C语言中如何将整数转换为字符? [复制]

    这个问题在这里已经有答案了 C语言中如何将整数转换为字符 C 中的字符已经是数字 字符的 ASCII 代码 无需转换 如果要将数字转换为相应的字符 只需添加 0 即可 c i 0 0 是 ASCii 表中的一个字符
  • 如何从句柄确定进程是 32 位还是 64 位?

    如何从使用 OpenProcess 获取的进程句柄中获取信息 无论进程是 32 位还是 64 位 是的 IsWow64Process 毫无用处 令人烦恼 它的真正意思是 启用了 32 位模拟 如果您在 32 位操作系统上运行 则返回 fal
  • RabbitMQ + Windows + LDAP 无需发送密码

    我正在尝试在 Windows 7 上使用 RabbitMQ 3 6 2 进行 LDAP 身份验证 授权 我已经在应用程序发送用户名 密码的情况下进行了基本身份验证 但密码位于我需要弄清楚如何进行的代码中避免 有没有人在不提供密码的情况下成功
  • Azure Function App Azure 服务总线触发器触发两次

    我使用带有服务总线触发器的 Azure Function Apps 来读取服务总线并对服务总线消息的内容执行操作 服务总线接收 JSON 序列化对象 然后将 JSON 消息反序列化回 Function App 中的对象 然而 由于某种原因
  • MonoGame 中的 ContentLoadException

    我一直在尝试使用 Xamarin Studio 在 MonoGame 中加载纹理 我的代码设置如下 region Using Statements using System using Microsoft Xna Framework usi
  • 通过 OCI 调用 Oracle 存储过程并使用 C++ 中的 out ref 游标返回结果

    我想使用 OCI 接口从 C 调用 Oracle 存储过程 并使用 out SYS REF CURSOR 作为过程的参数来迭代结果 我是 OCI 新手 所以可能会遗漏一些简单的东西 大部分代码取自这里 我的存储过程是 CREATE OR R

随机推荐

  • terraform aws_elastic_beanstalk_environment SSL 策略名称

    使用terraform 有谁知道如何设置预定义的ELB 的 SSL 安全策略 来自内部aws elastic beanstalk environment资源 我尝试了各种参数排列 从类似下面的内容中分支出来 但没有运气 setting na
  • 如何通过避免 mongodb 聚合中的空值来进行 $lookup

    在这里 我使用 lookup 到其他集合的左连接 查询工作正常 但是当某些记录缺少值时 它会返回 errmsg in requires an array as a second argument found null 查询文档结构如下 no
  • Angular 4 - 验证器自定义函数这是未定义的

    我正在构建一个应用程序 与组件 FormComponent 在里面我使用 Angular Core 的反应式表单模块 并创建一个自定义验证器 该函数正在使用 this 调用另一个函数 因为我认为它将引用 FormComponent 但它指的
  • Swift 中 `let` 和 `var` 有什么区别?

    有什么区别let and var用苹果的 Swift 语言 根据我的理解 它是一种编译语言 但它不会在编译时检查类型 这让我很困惑 编译器如何知道类型错误 如果编译器不检查类型 那不是生产环境的问题吗 当我尝试将值分配给 a 时出现此错误l
  • YouTube 视频标题背景

    我正在尝试创建一些网站模板来帮助我提高前端开发技能 因为我目前在后端工作方面做得更好 我试图在某种程度上复制我自己网站的风格 https thomas smyth co uk https thomas smyth co uk 这是一个简单的
  • ZF3会话超时问题

    我一直面临与使用 Zend Framework 3 的会话超时相关的问题 会话在 5 10 分钟内过期 我使用了会话的默认代码 Zf3 框架在全局 php如下 Session configuration session config gt
  • 如何将 GOPATH 链接到 LiteIDE?

    我已经安装了 LiteIde 并导出GOROOT and GOPATH in my bashrc 当我使用 LiteIDE 时 自动完成工作正常 但它无法构建 运行我的代码 当我查看 管理 GOPATH 时 系统 GOPATH 框是空的 我
  • 相同的 RSA 密钥、相同的消息、不同的加密[重复]

    这个问题在这里已经有答案了 我生成私钥 公钥和一个小文本文件 openssl genrsa out priv pem openssl rsa out pub pem in priv pem pubout echo A gt plain tx
  • 如何在matplotlib图中的特定位置添加网格线?

    如何在 matplotlib 图中 y 轴的特定位置添加网格 是的 这很简单 使用set x y ticks的方法axes对象并正常切换网格 import matplotlib pyplot as plt fig ax plt subplo
  • 如何在已处理的异常上停止 PyCharm 的中断/停止/停止功能(即仅在 python 未处理的异常上中断)?

    我发现 PyCharm 停止处理我的所有异常 甚至是我正在处理的异常try except堵塞 我不希望它在那里中断 我正在处理并且可能期待一个错误 但我确实希望它停止并暂停执行所有其他异常 例如 以便我拥有程序状态并对其进行调试 如何做到这
  • kafka生产者API中的标头信息

    我有一个 json 有效负载 我想将其作为生成器 Api 中的标头发送 type record created version 1 orgId userId userName correlationId jobId 以上有效负载应作为标头发
  • 正则表达式删除空 标签

    我想要这样的空跨度标签 填充有 nbsp 和空格 要删除 span nbsp nbsp nbsp span 我尝试过使用这个正则表达式 但它需要调整 span nbsp s span preg replace span nbsp s spa
  • 识别 Formik FieldArray 中已删除(创建和修改)的项目

    想知道 Formik 是否有一个本地解决方案来识别添加和删除 和更新 FieldArray以形式 我这里有沙箱上的代码https codesandbox io s jn7x2m75o9 https codesandbox io s jn7x
  • 如何使用FacesContext.getCurrentInstance(),它返回null

    在过去的几天里 我一直在为网络应用程序的登录部分而苦苦挣扎 我已经可以使用 tomcat 上的 JDBCRealm 成功验证用户身份 通过从 sql 服务器数据库读取用户 现在我想发送某种反馈当用户的帐户被阻止或凭据不正确时 这就是我现在陷
  • 通过 geopandas 连接多个 shapefile

    我试图通过实现以下内容来组合多个形状文件 import geopandas as gpd import pandas as pd for i in range 10 56 interesting files Users m3105 Down
  • 在 Visual Studio 中更改目标构建目录

    我是 Visual Studio 的新手 我导入了一个由多个子项目组成的 Visual Studio 项目 我可以构建所有这些 但我不知道 IDE 在构建后将可执行文件放在哪里 如何从 Visual Studio 获取 设置项目的目标目录
  • 如何像Crashlytics和开源PLCrashReporter一样获取崩溃行和方法

    正如我提到的 我正在尝试恢复崩溃的线路以及发生崩溃的功能 我需要提到的是 我已经尝试了 AppDelegate 中的下一个代码 并且我得到了未符号化的堆栈和类以及引发的错误 NSSetUncaughtExceptionHandler unc
  • 伪造、嘲笑和存根有什么区别?

    我知道如何使用这些术语 但我想知道是否有可接受的定义faking mocking and stubbing用于单元测试 您如何为您的测试定义这些 描述一下您可能会使用每种方法的情况 以下是我如何使用它们 Fake 实现接口但包含固定数据且不
  • Web3 BatchRequest 总是返回未定义,我做错了什么?

    我正在尝试使用 web3 Batch 来一起调用代币余额 当我调用batch execute 时 它返回未定义的而不是已添加到批处理中的已解决的请求 有人可以告诉我我把事情搞砸的地方吗 这是我的代码 async generateContra
  • mongodb 和 C# 中的工作单元

    我知道 MongoDB 不应该支持工作单元等 但我认为实现仅存储意图 类似于标准 然后将它们提交到数据库的存储库会很好 否则 在存储库中的每个方法中 您都必须创建与数据库的连接 然后将其关闭 如果我们将与数据库的连接放置在某个 BaseRe