wtorek, 1 listopada 2011

Unity - typowe użycie

Unity - DI kontener. W tym poście przedstawię kilka użyć z którymi najczęściej się spotykamy podczas pracy z tym kontenerem.

1. Rozwiązywanie zależności przez interfejsy


Code:
            var unityContainer = new UnityContainer(); //Tworzymy kontener
            unityContainer.RegisterType<ILogger, Logger>(); //Rejestacja typu
            
            var logger = unityContainer.Resolve<ILogger>();//Stworzenie obiektu

2. Tworzenie typu bez rejestracji go w kontenerze
Jeżeli chcemy stworzyć instancję klasy nie musimy jej wcześniej rejestrować w kontenerze Unity wystarczy napisać:


Code:
var person = unityContainer.Resolve<Person>();

Jeżeli konstruktor klasy Person zależałby od interfejsu ILogger, w momencie tworzenia obiektu Unity stworzyłby instancję Loggera (zarejestrowanego wcześniej).

3. Tworzenie singletonu
Jeżeli chcemy mieć możliwość tworzenia jednej instancji klasy - singletonu - wystarczy podczas rejestracji typu jako argument przesłać nową instancję klasy ContainerControlledLifetimeManager:


Code:
unityContainer.RegisterType<ILogger, Logger>(new ContainerControlledLifetimeManager());


4. Rejestracja nazwanych typów
Czasami mamy potrzebę rejestrowania nazwanych typów np. SqlLogger oraz ApplicationLogger. W Unity możemy łatwo zrealizować ten scenariusz:


Code:
            unityContainer.RegisterType<ILogger, SqlLogger>("SQLLOGGER");
            unityContainer.RegisterType<ILogger, ApplicationLogger>("APPLICATIONLOGGER");

            var loggers = unityContainer.ResolveAll<ILogger>();
            var sqlLogger = unityContainer.RegisterType<ILogger>("SQLLOGGER");

Jeżeli w metodzie Resolve podamy nazwę - otrzymamy żądaną instancję nazwaną klasy. Dzięki metodzie ResolveAll możemy pobrać wszystkie zarejestrowane klasy implementujące dany interfejs.

5. Rejestrowanie istniejących obiektów
Jeżeli chcemy zarejestrować istniejący obiekt w kontenerze korzystamy z metody RegisterInstance:

Code:
var currentLogger = new SqlLogger();
unityContainer.RegisterInstance(currentLogger);
Oczywiście obiekt zostanie zarejestrowany w tym momencie jako singleton.

6. Wstrzyknięcie zależności - właściwości
Jeżeli chcemy do stworzonego obiektu wstrzyknąć zależności np. rozważmy klasę:

Code:
using Microsoft.Practices.Unity;

namespace ConsoleApplication4
{
    public class ComplexCalculations
    {
        [Dependency]
        public ILogger Logger { get; set; }
    }
}

wystarczy wskazać konkretny obiekt i skorzystać z metody BuildUp:


Code:
            var complexCalculations = new ComplexCalculations();
            unityContainer.BuildUp(complexCalculations);

Przedstawione tutaj metody to część z możliwości które oferuje Unity. Pozostałe możliwości można znaleźć w manualu dostarczonego do biblioteki.

Brak komentarzy:

Prześlij komentarz