【发布时间】:2012-02-13 19:28:25
【问题描述】:
环境:ASP.NET MVC3 C#
假设我有一些存储库(半伪):
public interface IRepository
{
create();read();update();delete();opendb();closedb();
}
public class CarRepository : IRepository
{
private DbContext namedDbContext;
public void opendb()
{
namedDbContext = new DbContext();
}
public void closedb()
{
namedDbContext.dispose();
}
}
然后在控制器中注入存储库并按如下方式使用以手动控制数据库连接生存期:
public class SomeController : Controller
{
private IRepository CarRepository;
public void SomeController(IRepository _carRepository)
{
CarRepository = _carRepository;
}
public ActionResult SomeAction(int CarId)
{
CarRepository.opendb();
var car = CarRepository.read(CarId);
CarRepository.closedb();
}
}
这是否被认为是不好的做法,因为它从存储库控制连接并将其放置在控制器中?我担心使用依赖注入会导致内存泄漏,并希望确保不会打开重复的连接,也不会长时间运行和未使用。
【问题讨论】:
-
这种手动控制的优势是什么?有一些明显的缺点,但我几乎看不到任何优点。
-
这听起来像是对未知的恐惧。您应该直接使用 IoC 容器并玩得开心。
Install-Package Autofac.Mvc3 -
mvc3 框架使用了没有 dispose 方法的 IDependencyResolver,我正在考虑使用手动控制至少连接以确保没有内存泄漏。
-
IDependencyResolver只是一个服务定位器合约。由每个实施者决定如何清理资源。 -
看起来这可能是一个准备好的射击瞄准情况:(我想我会去装满水桶并寻找漏洞。
标签: c# asp.net-mvc-3 datacontext object-lifetime