如何使用依赖注入配置 Action<T>

How to configure Action<T> with dependency injection

我正在尝试了解 Action<T>Func<T> 是如何工作的,为此我创建了一个基础 class,它的构造函数中需要一个 Action<AppConfiguration>其他依赖项:

public abstract class GenericOracleTDRRepository<T> : IGenericTDRRepository<T>
{
        protected GenericOracleTDRRepository(ILogger<GenericOracleTDRRepository<T>> logger,
                                             Action<AppConfiguration> configuration,
                                             IUpdateSqlStringGenerator<T> generator)
        {
            if (configuration is null)
            {
                throw new ArgumentNullException(nameof(configuration));
            }

            Logger = logger ?? throw new ArgumentNullException(nameof(logger));
            configuration(AppSettings);
            _generator = generator ?? throw new ArgumentNullException(nameof(generator));
        }

      public AppConfiguration AppSettings { get; private set; } = new AppConfiguration();
}



public class RmesgOracleReposityory : GenericOracleTDRRepository<RMesg>, IGenericTDRRepository<RMesg>
{
    public RmesgOracleReposityory(ILogger<RmesgOracleReposityory> logger,
                                  Action<AppConfiguration> appSettings,
                                  IUpdateSqlStringGenerator<RMesg> generator) : base(logger, appSettings, generator)
    {
        Logger = logger;
    }

    public new ILogger<RmesgOracleReposityory> Logger { get; }
}

我正在我的 DI 容器中配置它:

services.AddScoped<IGenericTDRRepository<RMesg>, RmesgOracleReposityory>();
services.AddTransient<IUpdateSqlStringGenerator<RMesg>, UpdateSqlStringGenerator<RMesg>>();

我不确定应该在哪里以及如何为该对象传递有效的 Action<AppConfiguration>

您需要定义 Action<AppConfiguration> 才能在某处使用。

例如,如果您在 Startup class 中定义它,您可以使用接受 IServiceProviderAddScoped 的重载来解析其他依赖项并注入它像这样:

void TheAction(AppConfiguration appConfiguration) { }

services.AddScoped<IGenericTDRRepository<RMesg>, RmesgOracleReposityory>(serviceProvider =>
{
    var logger = serviceProvider.GetRequiredService<ILogger<RmesgOracleReposityory>>();
    var generator = serviceProvider.GetRequiredService<IUpdateSqlStringGenerator<RMesg>>();
    return new RmesgOracleReposityory(logger, TheAction, generator);
});

您也可以在 RmesgOracleReposityory class 中定义它并将其传递给基础 class' 构造函数:

public class RmesgOracleReposityory : GenericOracleTDRRepository<RMesg>, IGenericTDRRepository<RMesg>
{
    public RmesgOracleReposityory(ILogger<RmesgOracleReposityory> logger,
                                  IUpdateSqlStringGenerator<RMesg> generator) 
        : base(logger, TheAction, generator)
    {
        Logger = logger;
    }

    private void TheAction(AppConfiguration appConfiguration) { }

    public new ILogger<RmesgOracleReposityory> Logger { get; }
}

Action<T> 只是封装了一个 void 方法,该方法采用 T.

类型的单个参数