【发布时间】:2014-02-19 21:59:42
【问题描述】:
我正在为 DI 使用 ASP.Net MVC 4、EF 和 Unity。也使用 UnitOfWork 模式。试图找出实现这一点的最佳方法。我有如下代码。 我遇到的问题是业务和存储库层中的 Dispose() 现在永远不会被调用,只有两者中的 Destructor 都会被调用,所以对象似乎永远不会被释放。 请回答以下问题
我真的需要业务和存储库层中的 IDisposable 实现吗(如果 Unity 已经在处理它)
我应该怎么做才能调用 Dispose()(我应该将它也添加到 Controller 并 Dispose 所有其他对象还是使用某些特定的 LifeTime 管理器)
我是应该使用每个实例的单例实例还是在每个请求中处理它,就像它在 Web 环境中一样。
Global.asax.cs:
private static IUnityContainer _unityContainer;
protected void Application_Start()
{
_unityContainer = UnityBootstrapper.SetupUnity();
_unityContainer.RegisterType<IController, ProductController>("Product");
DependencyResolver.SetResolver(new Microsoft.Practices.Unity.Mvc.UnityDependencyResolver(_unityContainer));
}
UnityBootstrapper.cs:
public class UnityBootstrapper
{
public static IUnityContainer SetupUnity()
{
UnityContainer container = new UnityContainer();
container.RegisterType<IProductDbContext, ProductDbContext>()
.RegisterType<IUnitOfWork, UnitofWork>(new InjectionConstructor(new ResolvedParameter(typeof(IProductDbContext))))
.RegisterType<IProductRepository, ProductRepository>()
.RegisterType<IProductBusiness, ProductBusiness>();
}
}
ProductController.cs:
public class ProductController : ControllerBase
{
private readonly IProductBusiness _productBusiness;
public ProductController(IProductBusiness productBusiness)
{
_productBusiness = productBusiness;
}
//No Dispose for this
}
ProductBusiness.cs:
public class ProductBusiness : IProductBusiness, IDisposable
{
private readonly IUnitOfWork _unitOfWork;
private readonly IProductRepository _productRepository;
public ProductBusiness(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
_productRepository = _unitOfWork.ProductRepository;
}
public override void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected override void Dispose(bool disposing)
{
if (!_isDisposed)
{
if (disposing)
{
if (_productRepository != null) _productRepository.Dispose();
if (_unitOfWork != null) _unitOfWork.Dispose();
}
_isDisposed = true;
}
}
~ProductBusiness()
{
Dispose(false);
}
}
ProductRepository.cs:
public class ProductRepository : IProductRepository, IDisposable
{
private readonly IProductDbContext _context;
public ProductRepository(IProductDbContext context)
{
if (context == null)
throw new ArgumentNullException("context");
_context = context;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!_isDisposed)
{
if (disposing)
{
if (_context != null) _context.Dispose();
}
_isDisposed = true;
}
}
~ProductRepository()
{
Dispose(false);
}
}
【问题讨论】:
-
感谢大家的及时回复
-
SA,欢迎来到 StackOverflow。按照这个社区的惯例,您通过投票回答来表示“谢谢”。然后将最有用的答案标记为已接受的答案。请查看有关投票的常见问题解答部分:stackoverflow.com/help/why-vote
标签: c# asp.net-mvc-4 dependency-injection unity-container idisposable