几乎所有的控制器都有一个初始化程序实例化的存储库,如下所示:
public class CompanyController : CtsController
{
ICompanyRepository _repository = new CompanyRepository();
我想尝试确保我的存储库始终处于妥善处理状态,尤其是看到我冒充它们时,我相信一定要小心。但是,我不希望总是在每个操作方法的新using
循环中包装每个存储库调用。
MVC3如何处理控制器实例的生命周期和处理,如果我在它们上实现Disposable并在控制器的析构函数中处理我的repos就足够了吗?
答案 0 :(得分:9)
处理此问题的最佳方法是使用依赖注入(也称为控制反转或IOC)和自定义IControllerFactory,以便自动创建和处置存储库。这是一篇解释如何操作的文章:
Dependency Injection in ASP.NET MVC: Controllers
对于MVC3,您可能会发现一些建议使用IDependencyResolver的文章,但您应该谨慎,因为该接口没有Release回调并且会导致内存泄漏(取决于您决定使用哪个IOC容器)。
如果您不熟悉依赖注入,请在网上搜索有关其背后的创意的一些文章。
如果您不想切换到使用IOC,则可以使用覆盖OnActionExecuted方法的基本控制器并处理所有IDisposable。例如:
abstract class DisposingController : Controller
{
protected IList<IDisposable> Disposables;
protected DisposingController()
{
Disposables = new List<IDisposable>();
}
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
foreach (var disposable in Disposables)
{
disposable.Dispose();
}
base.OnActionExecuted(filterContext);
}
}
然后在你的控制器中:
var myRepository = new MyRepository();
Disposables.Add(myRepository);