如何使用依赖注入配置 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 中定义它,您可以使用接受 IServiceProvider
的 AddScoped
的重载来解析其他依赖项并注入它像这样:
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
.
类型的单个参数
我正在尝试了解 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 中定义它,您可以使用接受 IServiceProvider
的 AddScoped
的重载来解析其他依赖项并注入它像这样:
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
.