0

Я относительно новичок в инъекции зависимостей. Я думаю, что у меня есть идея, но теперь я получаю эту проблему. Предположим, что у меня есть несколько интерфейсов и несколько классов:Вложенные дженерики и инъекции зависимостей C#

interface IA<T> 
interface IB<IA<T>> 
class A<T> : IA<T> 
class B<IA<T>> : IB<IA<T>> 

Я хочу зарегистрировать следующее в моей инъекции зависимостей контейнера:

container.Register<IB<IA<T>>, B<A<T>>(...); 

Когда я пытаюсь решить IB<IA<T>>, он терпит неудачу с исключением пояснив, что IB<IA<T>> не может быть преобразован в B<A<T>>.

Почему это не удалось, и как я могу его исправить?

+1

Этот http: // stackov erflow.com/questions/26997923/non-generic-implementations-of-generic-interfaces#comment42526942_26997923 вопрос имеет объяснение, почему часть (есть много объяснений ковариации в C# ... не стесняйтесь искать то, которое вам нравится) , Как исправить будет зависеть от того, что вы на самом деле пытаетесь достичь/какие ограничения вы можете использовать на своих интерфейсах - подумайте о ковариации и уточните свои требования. –

ответ

1

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

public interface IA<T> 
{ 
    T Item { get; } 
} 

public interface IB<T> 
{ 
    IA<T> IA { get; } 
} 

реализаций Примеры:

public class A<T> : IA<T> 
{ 
    public T Item 
    { 
     get; 
     set; 
    } 
} 

public class B<T> : IB<T> 
{ 
    public B(IA<T> ia) 
    { 
     this.IA = ia; 
    } 

    public IA<T> IA 
    { 
     get; 
     private set; 
    } 
} 

Поскольку объект зависимость инъекции уведомление реализация B не имеет конструктор без параметров. Вместо этого он уведомляет о своей зависимости в конструкторе.

Настройка контейнера, первый регистр реализации IA:

 container.Register<IA<int>, A<int>>(); // specific implementation or 
     container.Register(typeof(IA<>), typeof(A<>)); // generic registration 

Регистрации IB будет таким же, и контейнер должен заботиться инъекционной зависимость к конструктору класса Б:

 container.Register<IB<int>, B<int>>(); 
     container.Register(typeof(IB<>), typeof(B<>)); 

разрешающему во время выполнения вам необходимо будет указать тип:

 var intIB = container.Resolve<IB<int>>(); 
     var stringIB = container.Resolve<IB<string>>(); 
Смежные вопросы