gpt4 book ai didi

c# - ASP.NET MVC、Unity 和 IDisposable

转载 作者:太空狗 更新时间:2023-10-29 21:44:44 28 4
gpt4 key购买 nike

我正在为 DI 使用 ASP.Net MVC 4、EF 和 Unity。还使用 UnitOfWork 模式。试图找出实现这一点的最佳方法。我有如下代码。我遇到的问题是业务层和存储库层中的 Dispose() 现在永远不会被调用,只有两者中的析构函数都被调用,所以对象似乎永远不会被释放。请回答以下问题

  1. 我真的需要在业务和存储层中实现 IDisposable(如果 Unity 已经在处理它)

  2. 我应该怎么做才能调用 Dispose()(我应该将它也添加到 Controller 并处理所有其他对象还是使用一些特定的 LifeTime 管理器)

  3. 我是应该使用每个的单例实例,还是应该像在 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);
}
}

最佳答案

你并不真的需要处置对象,除非你在处置过程中做了一些特定的事情。 DI 容器为您处理对象生命周期。

有时,UoW 实现涉及在处理时保存更改。尽量避免这种情况。但如果这是不可避免的,您可以为此实现工厂:

public interface IUnitOfWorkFactory
{
IUnitOfWork Create();
}

public class UnitOfWorkFactory : IUnitOfWorkFactory
{
public IUnitOfWork Create()
{
return new UnitOfWork();
}
}

public class UnitOfWork : IUnitOfWork, IDisposable
{
// other implementation


public void Dispose()
{
context.SaveChanges();
}
}

然后消费者会做这样的事情:

public MyController(IUnitOfWorkFactory workFactory)
{
this.workFactory = workFactory;
}

public ActionResult DoSomething()
{
using(var uow = workFactory.Create())
{
//do work
}
}

This DI book chapter谈论一次性元素。

关于c# - ASP.NET MVC、Unity 和 IDisposable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21893424/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com