簡體   English   中英

插入記錄器實例的.Net Core 2.2 AutoFac注冊依賴項

[英].Net Core 2.2 AutoFac Register Dependency that Injects a logger instance

工具版本

  • 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<>實例(您知道,就好像是魔術一樣!)

您可以在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM