首先是一些上下文:我有一个MVC3 .net项目,为了简洁起见,设置如下:
控制器 - 实例化服务对象(如下所述) - 使用服务从mongo检索db记录(例如_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接口,我相信确保调用Dispose的最好方法是使用'using'块,但是
1)何时/何地应该是?它应该在Service层中,在调用mongoRepository.Single方法的方法中吗?
2)什么时候应该实例化MongoRepository?
如果需要更多代码来回答请告诉我,我试图保持简短。提前谢谢。
答案 0 :(得分:3)
1)听起来您正在实例化并使用Service类中的Repository。而不是
var _mongoRepository = new MongoRepository(..);
_mongoRepository.Single(...);
你会有
using (var _mongoRepository = new MongoRepository(..))
{
_mongoRepository.Single(..);
}
如果要在MongoRepository类中包装Mongo调用,请确保Dispose
方法正确清除_server
连接(close / disconnect / whatever)。看起来您正在构造函数中创建连接,在方法中使用它但从不关闭它。
2)根据我的经验,最好尽可能晚地打开数据库连接并尽早关闭它 - 而不是打开它并为不同的查询多次使用它。
上对MongoDB(C#)连接进行了很好的讨论