首先是一些上下文:我有一个 MVC3 .net 项目,为简洁起见,它的设置如下所示:

Controller
- 实例化一个服务对象(如下所述)
- 使用服务从 mongo 检索数据库记录(例如 _service.GetPerson(id))
- 通过域查看

服务
- 实例化 MongoRepository(如下所述)
- 调用方法来检索数据库记录(例如 _mongoRepository.Single(c => c.Id == id))

MongoRepository : IDisposable
- 构造函数 (_server = Mongo.Create(ConfigurationManager.ConnectionStrings["mongodb"].ConnectionString))
- 单一方法(下)
- 处置方法

public T Single<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression) where T : class, new()
        {
            return _server.GetCollection<T>().AsQueryable()
                        .Where(expression).SingleOrDefault();
        }

现在,这是我的问题,因为您可以看到 MongoRepository 实现了 IDisposable 接口(interface),我相信确保调用 Dispose 的最佳方法是使用 'using' 块,但是

1)应该在什么时候/哪里?它应该在服务层,在调用 mongoRepository.Single 方法的方法内部吗?

2) MongoRepository 应该什么时候实例化?

如果需要更多代码来回答,请告诉我,我试图保持简短。提前致谢。

最佳答案

1)听起来您正在实例化和使用服务类中的存储库。所以代替

var _mongoRepository = new MongoRepository(..);
_mongoRepository.Single(...);

你将会拥有
using (var _mongoRepository = new MongoRepository(..))
{
    _mongoRepository.Single(..);
}

如果您将 Mongo 调用包装在 MongoRepository 类中,请确保 Dispose 方法正确清理了 _server 连接(关闭/断开连接/无论如何)。看起来您是在构造函数中创建连接,在方法中使用它但从未关闭它。

2)根据我的经验,最好尽可能晚地打开数据库连接并尽早关闭它 - 而不是打开它并针对不同的查询多次使用它。

.NET best practices for MongoDB connections? 上有一个关于 MongoDB (C#) 连接的很好的讨论

关于.net - 如何确保处理 MongoDB 连接(DB Hanging),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6050532/

10-13 06:24