【问题标题】:Constructor dependency injection is initializing service构造函数依赖注入正在初始化服务
【发布时间】:2018-10-22 06:14:08
【问题描述】:

我正在使用Autofac

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

我正在将服务注册为InstancePerLifetimeScope。所以在一个 Lifetime 范围内只创建一个实例。

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>();

上面这行初始化了需要 ILogger 实例的 RepoBackupImplemetaion 类,但由于此解析在同一个 LifeTimeScope 中,因此应传递相同的实例,但每次调用具有此依赖关系的构造函数时都会创建新实例。

 internal class RepoBackupImplemetaion : IRepoBackup
    {
        public RepoBackupImplemetaion(ILogger logger)
        {
            LogHelper = logger;
      }
    }

我将此服务注册为InstancePerLifetimeScope

我错过了什么吗?

【问题讨论】:

    标签: c# autofac ioc-container


    【解决方案1】:

    这意味着在您的代码中某处创建了一个新范围。

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

    【讨论】:

    • SingleInstance() 工作正常。但我想要多个 LifeTimeScope,因为我使用循环运行整个服务 2 -3 次,并且我希望每次运行都有不同的日志。
    • @Kalp 能否分享一下迭代代码?
    【解决方案2】:

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

    您应该使用单一实例来为您的聚会服务。因为它从根和所有嵌套范围内的所有请求中返回一个实例。

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

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

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

    谢谢。

    【讨论】:

    • 构造函数因为这个调用而被调用 var repobackup = container.Resolve();这在单个 LifetimeScope 中只调用一次,因此应该只实例化一个 ILogger。
    • 在您的情况下解析 ILogger 时,正在嵌套范围中创建多个实例。 InstancePerLifetimeScope() 顾名思义是基于作用域的。
    【解决方案3】:

    原来 LogHelper 服务也被设置为 SingleInstance() 的服务使用。为此,为 SingleInstance() 创建了一个新实例。 我将 SingleInstance 更改为 InstancePerLifetimeScope,现在它可以正常工作了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-28
      • 2011-03-05
      • 1970-01-01
      • 2011-02-02
      • 2019-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多