[英]How to register IFileProvider for the dependency injection in asp.net core 2.2?
[英].Net Core 2.2 AutoFac Register Dependency that Injects a logger instance
工具版本
問題
我正在嘗試將記錄器實例注入到已經由Autofac配置為依賴項注入的類中
設定
我有一個查詢數據庫的類。 該類具有由Autofac注入的連接字符串。 以下設置適用。
沒有注入Logger的類:
public class ItemQueries
: IItemQueries
{
private readonly string _connectionString = default(string);
public ItemQueries(string connectionString)
{
_connectionString = !string.IsNullOrWhiteSpace(connectionString) ? connectionString : throw new ArgumentNullException(nameof(connectionString));
}
public async Task<ItemViewModel> GetItemAsync(int id)
{
using (var connection = new SqlConnection(_connectionString))
{
connection.Open();
var result = await connection.QueryAsync<dynamic>(
@"SELECT *
FROM dbo.items
WHERE Id=@id"
, new { id }
);
if (result.AsList().Count == 0)
{
throw new KeyNotFoundException();
}
return MapItem(result.FirstOrDefault());
}
}
private ItemViewModel MapItem(dynamic result)
{
return new ItemViewModel()
{
Id = result.Id,
Name = result.Name
};
}
}
這就是我向Autofac注冊課程的方式:
public class ItemModule
: Autofac.Module
{
public string QueriesConnectionString { get; }
public ItemModule(string queriesConnectionString)
{
QueriesConnectionString = queriesConnectionString;
}
protected override void Load(ContainerBuilder builder)
{
builder.Register(c => new ItemQueries(QueriesConnectionString)) // <-- this breaks when I make the below changes because it's looking for an instance of ILogger<ItemQueries>
.As<IItemQueries>()
.InstancePerLifetimeScope();
}
}
但是,我想將Logger實例注入到ItemQueries
類中,因此我將其注入到構造函數中,如下所示:
private readonly ILogger<ItemQueries> _logger;
private readonly string _connectionString = default(string);
public ItemQueries(ILogger<ItemQueries> logger, string connectionString)
{
_logger = logger;
_connectionString = !string.IsNullOrWhiteSpace(connectionString) ? connectionString : throw new ArgumentNullException(nameof(connectionString));
}
但這破壞了我在Autofac模塊中的注冊。 如何告訴Autofac ItemQueries
類需要注入Logger實例?
我以為Autofac能夠鍛煉ItemQueries
類需要注入ILogger<>
實例(您知道,就好像是魔術一樣!)
您可以在lambda注冊中解決問題。 這就是lambda中的context參數的用途。
builder
.Register(c =>
new ItemQueries(QueriesConnectionString, c.Resolve<ILogger<ItemQueries>>()))
.As<IItemQueries>()
.InstancePerLifetimeScope();
您需要使用Autofac的功能“工廠”。
這是使用Factory解決方案的設置
private readonly ILogger<ItemQueries> _logger;
private readonly string _connectionString = default(string);
public delegate ItemQueries Factory(string connectionString); // --> here, you create the delegate factory
// connectionString needs to be the first parameter
public ItemQueries(string connectionString, ILogger<ItemQueries> logger)
{
_logger = logger;
_connectionString = !string.IsNullOrWhiteSpace(connectionString) ? connectionString : throw new ArgumentNullException(nameof(connectionString));
}
並且模塊設置應如下所示:
public class ItemModule: Autofac.Module
{
public string QueriesConnectionString { get; }
public ItemModule(string queriesConnectionString)
{
QueriesConnectionString = queriesConnectionString;
}
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<ItemQueries>(); // --> not sure if needed
builder.Register(c =>
{
var factory = c.Resolve<ItemQueries.Factory>();
return factory.Invoke(QueriesConnectionString);
})
.As<IItemQueries>()
.InstancePerLifetimeScope();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.