了解Autofac生命周期范围

时间:2012-12-13 12:15:48

标签: c# autofac

从Autofac的文档中,我了解到它会引用它创建的每个IDisposable实现者。因此它可能导致OutOfMemoryException。因此,建议的解决依赖关系的方法是使用ILifetimeScope。

假设IService实现了IDisposable。

class MaintenanceTask {
    private IService service;
    public MaintenanceTask(ILifetimeScope lifetimeScope) {
        service = lifetimeScope.Resolve<IService>();
    }
    //...do your work
}

但这种方法的问题在于它隐藏了依赖关系。我必须查看代码以了解该类所依赖的内容。还有其他方法可以更明确地处理这个问题吗?更具体地说,在不必查看代码的情况下使依赖关系变得更加明显?还是我完全弄错了?

2 个答案:

答案 0 :(得分:6)

传入生命周期范围就像传入容器本身一样。它类似于Service locator (anti-) pattern,并且确实存在您所描述的问题:
依赖变得不明显。

有一件事要问自己:
你真的遇到了记忆问题吗?如果没有,我不会打扰。

另一个指针:
如果您有单独的服务应该在使用后立即处理,请使用工厂创建它们,并使您的课程取决于工厂而不是服务本身。

生命范围的使用场景略有不同:
当您需要本地组合根时使用它们。我从来没有在Windows应用程序中需要这样的东西,但在Web应用程序中,会话或请求可能需要本地组合根。

答案 1 :(得分:0)

这个问题对我来说很烦人,我创建了一个库来解决它。

看看Dependable

使用它,您的代码将更改为:

<div class="container-logos">

  <div class="logo"></div>
  <div class="logo"></div>
  <div class="logo"></div>
  <div class="logo"></div>
  <div class="logo"></div>
  <div class="logo"></div>
  <div class="logo"></div>
  <div class="logo"></div>
  <div class="logo"></div>
  <div class="logo"></div>
  <div class="logo"></div>
  <div class="logo"></div>
  <div class="logo"></div>
  <div class="logo"></div>

</div>
相关问题