Как внедрить с помощью DI два объекта одного типа, но с одним другим свойством?

Я пытаюсь внедрить два одноэлементных клиента Cosmos, которые во всех смыслах одинаковы, за исключением свойства, которое меняет их поведение, но мне нужны оба. Вот как я добавляю их в автозагрузку:

        services.AddSingleton(new CosmosClientBuilder(CosmosConnStr))
            .Build());
        services.AddSingleton(new CosmosClientBuilder(CosmosConnStr))
            .WithBulkExecution(true)
            .Build());

Затем в классах я ввожу как:

public CosmosService(CosmosClient cosmosClient, CosmosClient bulkCosmosClient)

Проблема в том, как отличить одно от другого?


person user33276346    schedule 11.02.2021    source источник
comment
Отвечает ли это на ваш вопрос? Внедрение зависимостей нескольких экземпляров того же типа в ASP.NET Core 2   -  person gunr2171    schedule 11.02.2021
comment
Можете ли вы отличить их по интерфейсу? Зарегистрируйте один из них как ICosmosClient, а другой как IBulkCosmosClient.   -  person user2363676    schedule 11.02.2021
comment
@user2363676 user2363676 К сожалению, Cosmos — это внешняя библиотека.   -  person user33276346    schedule 11.02.2021


Ответы (1)


Самый простой способ в вашем случае - использовать IEnumerable<CosmosClient>:

public CosmosService(IEnumerable<CosmosClient> bulkCosmosClient)

Расширенный образец:

public class CosmosClient
{
    public string Connection;

    public CosmosClient(string v)
    {
        this.Connection = v;
    }
}

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();

    services.AddSingleton(new CosmosClient("AA"));
    services.AddSingleton(new CosmosClient("BB"));
}

[ApiController]
[Route("[controller]")]
public class CosmosController : ControllerBase
{
    private readonly IEnumerable<CosmosClient> _bulkCosmosClient;

    public CosmosController(IEnumerable<CosmosClient> bulkCosmosClient)
    {
        _bulkCosmosClient = bulkCosmosClient;
    }

    public IActionResult Index()
    {
        List<string> list = new List<string>();
        foreach (var c in _bulkCosmosClient)
        {
            list.Add(c.Connection);
        }

        return new JsonResult(list);
    }
}

введите здесь описание изображения

введите здесь описание изображения

person Boris Sokolov    schedule 11.02.2021