簡體   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