我的几乎所有控制器都被初始化这样的实例化的库:
public class CompanyController : CtsController
{
ICompanyRepository _repository = new CompanyRepository();
我想尝试,并确保我的仓库总是妥善处置,尤其是看到我在他们做模拟,而且我相信我们必须要小心这里。 但是,我不希望有始终包裹在一个新的每一个仓库的呼叫using
循环中的每一个动作方法。
如何寿命和处置控制器实例后MVC3看,是不够的,如果我实现一次性他们,在析构函数控制我的回购处置?
要解决这个问题,最好的办法是使用依赖注入(也称为控制或IOC反转),并从而创建存储库和设置的自动定制IControllerFactory。 下面是一篇文章,解释如何做到这一点:
依赖注入在ASP.NET MVC:控制器
对于MVC3,你可能会发现一些文章用的IDependencyResolver而不是推荐,但你应该小心的是,因为该接口没有一个释放的回调,将导致内存泄漏(取决于其IOC容器,你决定使用)。
如果你是新的依赖注入,在网络上搜索关于它背后的想法的文章。
如果你不想切换到使用国际奥委会,那么你可以使用一个基本的控制器,它覆盖OnActionExecuted方法和所有IDisposables的处置。 例如:
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);