我正在使用Autofac。
builder.RegisterType<LogHelper>().As<ILogger>().InstancePerLifetimeScope();
我正在将{的服务注册为InstancePerLifetimeScope
。因此,在一个生命周期范围内只能创建一个实例。
using (var container = Container.BeginLifetimeScope())
{
var logger = container.Resolve<ILogger>();
var logge1r = container.Resolve<ILogger>();
var logger1 = container.Resolve<ILogger>();
var repobackup = container.Resolve<IRepoBackup>();
repobackup.StartProcess();
}
这两个解决方案给了我相同的实例。
var logger1 = container.Resolve<ILogger>();
var logger2 = container.Resolve<ILogger>();
某些服务需要通过依赖注入来提供此服务。
var repobackup = container.Resolve<IRepoBackup>();
以上行初始化了RepoBackupImplemetaion
类,该类需要ILogger
实例,但由于此解析位于同一LifeTimeScope中,因此应传递相同的实例,但是每次调用具有此依赖项的构造函数时都将创建新的实例
internal class RepoBackupImplemetaion : IRepoBackup
{
public RepoBackupImplemetaion(ILogger logger)
{
LogHelper = logger;
}
}
我将此服务注册为InstancePerLifetimeScope
。
我想念什么吗?
答案 0 :(得分:1)
这意味着在代码中的某个地方正在创建新的作用域。
如果唯一的问题与仅具有SingleInstance()
接口的单个实例有关,则可以使用InstancePerLifetimeScope()
代替ILogger
。
答案 1 :(得分:0)
InstancePerLifetimeScope()为每个嵌套的生存期范围创建实例。因此,每次构造函数创建不同的实例时都调用它。原因是,每次调用的范围也不同。
您应该使用单个实例来满足您的需求。因为它从根目录和所有嵌套作用域中的所有请求中返回一个实例。
builder.RegisterType<LogHelper>().As<ILogger>().SingleInstance();
选中此链接以获取更多信息:
https://autofaccn.readthedocs.io/en/latest/lifetime/instance-scope.html#instance-per-lifetime-scope
谢谢。
答案 2 :(得分:0)
事实证明,设置为SingleInstance()的服务也使用LogHelper服务。为此,将为SingleInstance()创建一个新实例。 我将SingleInstance更改为InstancePerLifetimeScope,现在可以正常使用了。