了解Autofac寿命范围

问题描述 投票:6回答:2

从Autofac的文档中,我知道它一直引用它创建的每个IDisposable实现程序。因此,它可能导致OutOfMemoryException。因此,建议的解决依赖关系的方法是使用ILifetimeScope。

假设IService实现IDisposable。

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

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

c# autofac
2个回答
6
投票

传递生存期范围就像传递容器本身。它类似于Service locator (anti-) pattern,并且完全具有您描述的问题:依赖性变得不明显。

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

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

生存期范围的使用情况有些不同:当您需要本地合成根时使用它们。在Windows应用程序中,我从来不需要这样的东西,但是在Web应用程序中,“会话”或“请求”可能需要本地组合根。


0
投票

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

看看Dependable

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

class MaintenanceTask {
    private IService service;
    public MaintenanceTask(IScopeFactory<IService> serviceFactory) {
        using(var serviceScope = serviceFactory.CreateScope())
        {
             service = serviceScope.Value;
             //...do your work
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.