【问题标题】:Using Unity, how do you automatically dispose an IDisposable?使用 Unity,如何自动处置 IDisposable?
【发布时间】:2013-10-01 13:45:50
【问题描述】:

如何使用 Unity 作为 IoC 自动处置通过 DI 新增的实现 IDisposable 的类?

例如,假设我有一个包含以下层的 MVC 应用程序:

  1. MVC
  2. 服务
  3. 存储库(为 CRUD 操作实现工作单元模式的实体框架)

存储库层中的UnitOfWork 类实现IDisposable 接口,并通过Unity 使用DI 注入服务层。除非我遗漏了什么,否则在不自动处理 UnitOfWork 类的情况下,您需要覆盖调用服务的控制器上的 Dispose() 方法(也需要实现 IDisposable),然后在堆栈中冒泡,直到您到达UnitOfWork 上的Dispose() 方法(如果您没有使用工作单元模式,则访问相应的存储库)。

例如

// controller
protected override void Dispose(bool disposing)
{
    if (_serviceLayer != null)
    {
        _serviceLayer.Dispose();
    }
    base.Dispose(disposing);
}

// service layer
public override Dispose() {
    if (_uow != null)
    {
        _uow.Dispose();
    }
}

// unit of work
public void Dispose() {
    if (_context != null)
    {
        _context.Dispose();
    }
}

This thread 表示不支持? “只有少数情况下 Unity 会处理实例。确实不支持” Unity 3.0 仍然如此。

【问题讨论】:

    标签: entity-framework inversion-of-control unity-container unit-of-work


    【解决方案1】:

    如果您使用Unity bootstrapper for ASP.NET MVC 的 PerRequestLifetimeManager,那么在 HTTP 请求结束时,UnityPerRequestHttpModule 将处理所有注册到实现 IDisposable 的 PerRequestLifetimeManager 的对象。

    【讨论】:

    • 在注册类型时使用一个简单的接口和实现 IDisposable 并结合 PerRequestLifetimeManager 的实现时,我无法触发 dispose 方法。这还能用吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    相关资源
    最近更新 更多