poniedziałek, 19 grudnia 2011

Unity wstrzykiwanie w konstruktorze kolekcji obiektów danego typu

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