如何使用依赖注入创建和配置同一个类的多个实例?

问题描述 投票:0回答:1

如何使用依赖注入创建和配置同一类的多个实例?

我看过类似的问题/教程,但我还不明白。

举个例子:

容器

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",
            },
    }
}
c# dependency-injection ioc-container
1个回答
0
投票

我建议将应用程序设置更改为:

{
  // ...
  "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
可以展平/移除以简化配置。

© www.soinside.com 2019 - 2024. All rights reserved.