Версии инструмента
- asp.net core 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.Как мне сообщить Autofac, что класс ItemQueries
требует, чтобы экземпляр Logger был введен?
Я думал, что Autofac сможет рассчитать, что классу ItemQueries
нужен экземпляр ILogger<>
для инъекции (вызнаешь, как по волшебству!)