Почему система DI .NET не понимает вариации общего интерфейса?C#

Место общения программистов C#
Ответить
Anonymous
 Почему система DI .NET не понимает вариации общего интерфейса?

Сообщение Anonymous »

Рассмотрим этот пример:

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

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddTransient();
builder.Services.AddTransient();

var app = builder.Build();

var hooks = app.Services.GetServices();
Console.WriteLine(hooks.Length); // 1 (bummer...)

public interface IEvent;

public interface IHook where TEvent : IEvent
{
void On(TEvent @event);
}

public record SpecificEvent(int Foo) : IEvent;

public class SpecificEventHook : IHook
{
public void On(SpecificEvent @event)
{

}
}
public class GeneralEventHook : IHook
{
public void On(IEvent @event)
{

}
}
Когда я пытался разрешить список IHook от поставщика услуг, я ожидал получить GeneralEventHook (который является IHook< IEvent>), поскольку общий параметр IHook является контравариантным (

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

in TEvent); и, следовательно, IHook
фактически можно назначить IHook.
Но это похоже на стандартную зависимость .NET Система впрыска этого не поддерживает. На удивление, в Интернете очень мало информации об этом типе сценария.
Мне интересно, почему? Нет ли способа настроить контейнер DI для достижения этой цели? Если нет, то какой разумный обходной путь может быть для такого типа требований?

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

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

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

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

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

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