[英]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.