繁体   English   中英

构造函数依赖注入正在初始化服务

[英]Constructor dependency injection is initializing service

我正在使用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

我想念什么吗?

这意味着在代码中的某个地方正在创建新的作用域。

如果唯一的问题与仅具有ILogger接口的单个​​实例有关,则可以使用SingleInstance()而不是InstancePerLifetimeScope()

InstancePerLifetimeScope()为每个嵌套的生存期范围创建实例。 因此,每次构造函数创建不同的实例时都调用它。 原因是,每个调用的范围也不同。

您应该使用单个实例来满足您的需求。 因为它从根目录和所有嵌套作用域的所有请求中返回一个实例。

builder.RegisterType<LogHelper>().As<ILogger>().SingleInstance();

检查此链接以获取更多信息:

https://autofaccn.readthedocs.io/en/latest/lifetime/instance-scope.html#instance-per-lifetime-scope

谢谢。

事实证明,设置为SingleInstance()的服务也使用LogHelper服务。 为此,将为SingleInstance()创建一个新实例。 我将SingleInstance更改为InstancePerLifetimeScope,现在工作正常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM