我正在使用ASP.Net MVC 4,EF和Unity的DI。也使用UnitOfWork模式。試圖找出實現這一點的最佳方式。我有如下的代碼。 我遇到的問題是Dispose()在業務和存儲庫層現在不會被調用,只有在兩個析構函數被調用,所以對象似乎永遠不會被處置。 請回答下列ASP.NET MVC,Unity和IDisposable
我真的需要在業務了IDisposable執行和庫層(如果統一已經照顧吧))稱爲
我應該怎麼做才能得到的Dispose( (我應該把它添加到控制器也和處置所有其他對象,或者使用一些特定的生命期管理器)
我是否應該使用每個的單一實例或處置其在每個請求,因爲它是在網絡環境中。
的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。按照這個社區的慣例,你可以通過投票答案來說「謝謝」。然後將最有用的答案標記爲已接受的答案。請查看常見問題解答部分,瞭解有關投票的最新信息:http://stackoverflow.com/help/why-vote – trailmax