6

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

假设 IService 实现 IDisposable。

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

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

4

2 回答 2

6

传入生命周期范围就像传入容器本身一样。它类似于服务定位器(反)模式,并且具有您所描述的问题:
依赖性变得不明显。

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

另一个提示:
如果您有应在使用后立即处置的个别服务,请使用工厂来创建它们并使您的类依赖于工厂而不是服务本身。

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

于 2012-12-13T13:24:31.970 回答
0

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

看看可靠的。

有了它,您的代码将更改为:

class MaintenanceTask {
    private IService service;
    public MaintenanceTask(IScopeFactory<IService> serviceFactory) {
        using(var serviceScope = serviceFactory.CreateScope())
        {
             service = serviceScope.Value;
             //...do your work
        }
    }
}
于 2020-01-07T18:21:00.250 回答