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

时间:2018-10-22 06:14:09

标签: c# autofac ioc-container

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

我想念什么吗?

3 个答案:

答案 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,现在可以正常使用了。