mongodb和C#的工作单位

Yur*_*han 28 c# mongodb mongodb-.net-driver

我知道MongoDB不应该支持工作单元等.但我认为实现只存储意图(类似于标准)然后将它们提交给数据库的存储库会很好.否则,在存储库中的每个方法中,您都必须创建与DB的连接,然后将其关闭.如果我们将连接放置在某个BaseRepository类中的DB,那么我们将我们的存储库绑定到具体的数据库,并且测试存储库非常困难,以测试解决存储库的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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

Chr*_*tow 18

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

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

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

有关具有MongoDB,SQL Server和JSON实现的存储库模式的简单示例,请查看NBlog存储代码.它使用Autofac IoC将具体的存储库注入ASP.NET MVC应用程序.