c# - .Net Core 2.2 AutoFac 注册依赖注入记录器实例
问题描述
工具版本
- ASP.NET 核心 2.2
- Autofac 4.9.2
问题
我正在尝试将记录器实例注入到已配置为 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 模块中的注册。如何告诉 AutofacItemQueries
该类需要注入 Logger 实例?
我认为 Autofac 将能够锻炼ItemQueries
该类需要ILogger<>
注入实例(你知道,就像魔术一样!)
解决方案
您可以在 lambda 注册中解决问题。这就是 lambda 中的 context 参数的用途。
builder
.Register(c =>
new ItemQueries(QueriesConnectionString, c.Resolve<ILogger<ItemQueries>>()))
.As<IItemQueries>()
.InstancePerLifetimeScope();
推荐阅读
- lambda - Stream API:从同一对象中收集基于另一个属性条件的属性列表
- django - 我在使用 docker nginx 和 gunicorn 部署我的 django 项目时遇到问题
- sql - 对 2 列求和并合并行
- java - 为什么我们必须在 Java 中的 if 语句之外声明变量
- php - iFrame - 退出全屏的问题
- python - 如何将只有日期和月份列的数据框解析为具有 pd.datetime 格式的新列?
- python - 删除 txt 文件中某些行中的结束/尾随逗号
- c# - 使用 API 自动发布事件,日期和时间不正确
- python - 为什么我的 Python 代码输出多行?
- angular - 如何在循环引导轮播中以角度传递图像?我正在尝试使用 *ng for 但它最终只出现在数组中的第一个图像