Ostatnio napotkałem na problem wstrzykiwania w konstruktorze kolekcji obiektów danego typu. Zobaczmy na prostą hierarchię klas:
Code:
public abstract  class A
    {
        
    }
    public class B : A
    {
        
    }
    public class C : A
    {
        
    }
 
Chcąc następnie wstrzyknąć taką hierarchię w konstruktorze klasy jako:
Code:
    public class D
    {
        private readonly IEnumerable<A> _resolvedClasses;
        D(IEnumerable<A> resolvedClasses)
        {
            _resolvedClasses = resolvedClasses;
        }
    }
 
Otrzymamy następujący błąd:
Aby poprawnie wykonać operację wstrzyknięcia wszystkich klas potomnych po A należy zarejestrować każdy z typów jako nazwany:
Code:
unityContainer.RegisterType<A, B>("B");
unityContainer.RegisterType<A, C>("C");
 
Następnie dopisujemy linijkę rejestrującą IEnumerable od naszego typu:
Code:
unityContainer.RegisterType<IEnumerable<A>>(new InjectionFactory(x => x.ResolveAll<A>()));
 
Po takim zabiegu możemy już bez przeszkód korzystać z kolekcji obiektów danego typu w konstruktorach.
 
Brak komentarzy:
Prześlij komentarz