Наследование ключа при внедрении зависимостей на основе ключейC#

Место общения программистов C#
Ответить
Anonymous
 Наследование ключа при внедрении зависимостей на основе ключей

Сообщение Anonymous »

Я создаю API:, где контроллеры часто работают с несколькими «сайтами».
(на самом деле не работаю с заказами, но используется в качестве примера)

Код: Выделить всё

[ApiController]
[Route("{site}/Order")]
public class OrderController
{
private readonly Dictionary _orderModels;

public class OrderController(Dictionary orderModels)
{
_orderModels = orderModels;
}

[HttpGet("{orderNumber:int}"]
public async Task GetOrderAsync(string site, int orderNumber)
{
if (!_orderModels.TryGetValue(site, out var orderModel))
return NotFound();
if (!User.HasAccessToSite(site))
return Forbid();

var order = await orderModel.GetExistingOrderAsync(orderNumber);

return Ok(order)
}
}
Он работает нормально, но мне нужен метод CreateOrderModels, где я вручную обрабатываю все зависимости

Код: Выделить всё

private static Dictionary CreateOrderModels(IServiceProvider services)
{
var orderModels = new Dictionary();
var site1Repository = services.GetRequiredService();
var logger = services.GetRequiredService>();

orderModels.Add("Site1", new CommonOrderModel(site1Repository, logger);
...
return orderModels;
}
(Обычно это просто сайты типа «test» и «prod», так что это не имеет большого значения, но хотелось бы использовать встроенную функциональность)
Я думал, что с помощью нового DI на основе ключей я смогу упростить создание, например

Код: Выделить всё

services.AddKeyedSingleton("Site1");
services.AddKeyedSingleton("Site2");
services.AddKeyedSingleton("Site3");
services.AddKeyedSingleton("Site1");
services.AddKeyedSingleton("Site2");
services.AddKeyedSingleton("Site3");
Проблема здесь в том, что CommonOrderModel имеет зависимости, специфичные для сайта.
Я хотел бы сделать что-то вроде:

Код: Выделить всё

public CommonOrderModel([FromKeyedServices(KeyedService.ParentKey)] IRepository repository, ILogger logger)
т.е. Когда создается CommonOrderModel для «Site1», я хочу, чтобы он использовал IRepository для того же ключа.
Я понимаю, что это невозможно «из коробки». Пытался просмотреть исходный код, чтобы посмотреть, смогу ли я куда-нибудь внедрить эту функциональность, но не смог.
Основная проблема, по-видимому, заключается в том, что граф зависимостей недоступен ни в одном фабричном методе, поэтому его невозможно получить ключ сверху.
А такое вообще возможно?

Подробнее здесь: https://stackoverflow.com/questions/790 ... -injection
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»