我在 .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 生命周期范围?
在 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();