如何使用依赖注入创建和配置同一类的多个实例?
我看过类似的问题/教程,但我还不明白。
举个例子:
容器
public class App()
{
public IHost Host { get; }
public App()
{
Host = Microsoft.Extensions.Hosting.Host.
CreateDefaultBuilder().
ConfigureServices((context, services) =>
{
services.AddSingleton<ITemperatureSensor, AcmeTemperatureSensor>();
services.AddSingleton<IAcmeMachine, AcmeMachine>();
services.Configure<TemperatureSensorOptions>(context.Configuration.GetSection(nameof(TemperatureSensorOptions)));
}).
Build();
}
}
Acme 机器
这是应该注入温度传感器的地方。
public class AcmeMachine()
{
public AcmeMachine( Something? )
{
// How inject the temperature sensors?
}
ITemperatureSensor WaterSensor
ITemperatureSensor AirSensor
}
温度传感器
public interface ITemperatureSensor
{
string SerialNumber;
double GetTemperature();
}
public class AcmeTemperatureSensor()
{
public string SerialNumber { get; }
public AcmeTemperatureSensor(IOptions<TemperatureSensorOptions> options)
{
SerialNumber = options.Value.SerialNumber;
}
public double GetTemperature()
{
return 25.0;
}
}
设置
appsettings.json
{
"WaterSensor": {
"TemperatureSensorOptions": {
"SerialNumber": "123",
},
},
"AirSensor": {
"TemperatureSensorOptions": {
"SerialNumber": "456",
},
}
}
我建议将应用程序设置更改为:
{
// ...
"Sensors": {
"WaterSensor": {
"TemperatureSensorOptions": {
"SerialNumber": "123"
}
},
"AirSensor": {
"TemperatureSensorOptions": {
"SerialNumber": "456"
}
}
}
}
然后您将能够读取配置为:
builder.Services.Configure<Dictionary<string, Sensor>>(builder.Configuration.GetSection("Sensors"));
class Sensor
{
public TemperatureSensorOptions TemperatureSensorOptions { get; set; }
}
class TemperatureSensorOptions
{
public string SerialNumber { get; set; }
}
并将其作为
IOptions<Dictionary<string, Sensor>>
注入到一些服务中。
请注意,如果传感器没有任何其他设置,
TemperatureSensorOptions
可以展平/移除以简化配置。