Autofac:注册Singleton和InstancePerDependency依赖关系

问题描述 投票:0回答:1

我在 .NET 应用程序中使用 Autofac 进行依赖项注入。我有一个场景,我想将服务注册为单例,并将其依赖项注册为 InstancePerDependency。这是我想要实现的目标的简化示例:


builder.Register(c => new ClassA()).As<IClassA>().InstancePerDependency();

builder.Register(c => new ClassB(c.Resolve<IClassA>()))
       .As<IClassB>()
       .SingleInstance();

在此设置中将 ClassB 注册为单例是否会影响 IClassA 的 InstancePerDependency 生命周期范围?如果是这样,如何实现单例 IClassA,同时确保 IClassA 遵循 InstancePerDependency 生命周期范围?

c# inversion-of-control autofac
1个回答
0
投票

在 Autofac 中,当您将服务注册为单例并将其依赖项注册为 InstancePerDependency 时,单例服务(在您的情况下为 ClassB)将在其整个生命周期中保留其依赖项(在您的情况下为 ClassA)的单个实例。这意味着每次解析

ClassB
时,它将使用
ClassA
的相同实例。

如果您希望

ClassA
遵循 InstancePerDependency 生命周期范围,同时确保
ClassB
保持单例,则可以通过将
ClassA
注册为工厂委托而不是具体实例来实现此目的。您可以通过以下方式修改您的注册:

builder.Register(c => new ClassA()).As<IClassA>().InstancePerDependency();

builder.Register(c =>
{
    var classAFactory = c.Resolve<Func<IClassA>>();
    return new ClassB(classAFactory());
})
.As<IClassB>()
.SingleInstance();
© www.soinside.com 2019 - 2024. All rights reserved.