Работа с блока за приложения на Unity

Подобно на Castle Windsor и StructureMap, Unity Application Block също е IoC (Inversion of Control) контейнер. Unity Application Block от Microsoft е лек разтегателен контейнер за инжектиране на зависимости. Той осигурява поддръжка за инжектиране на конструктор, инжектиране на свойства и също инжектиране на извикване на метод. Между другото, Unity Application Block беше въведен като част от Enterprise Library.

В случай, че не сте запознати с това какво представлява инжектирането и инверсията на контрола на зависимостите, ето кратко обяснение. Инжектирането на зависимост е реализация на принципа на IoC. И инверсията на управление, и инжектирането на зависимости са начини, които ви позволяват да прекъснете зависимостите между компонентите във вашето приложение. Принципът на впръскване на зависимост гласи, че модулите от високо ниво в дадено приложение не трябва да зависят от модулите за ниско ниво; по-скоро и двете трябва да зависят от абстракции.

Unity Application Block цели на дизайна

Блокът за приложение на Unity е контейнер за инжектиране на зависимост (DI). Имайте предвид, че блокът за приложения на Unity няма никаква зависимост от конфигурационната система на Enterprise Library. Следователно можете да го използвате като самостоятелен контейнер за инжектиране на зависимости, без да е инсталирана Enterprise Library във вашата система. Целите на дизайна на Unity Application Block включват следното:

  1. Насърчаване на модулен дизайн чрез отделяне
  2. Осигуряване на бърз, разтегателен, лек контейнер за инжектиране в зависимост от теглото
  3. Осигурете поддръжка за разширяемост чрез разширения
  4. Осигурете поддръжка за инжектиране, управлявано от атрибут
  5. Осигурете поддръжка за интуитивен API за свързване и работа с контейнера за инжектиране на зависимости

Приготвяме се да започнем

В този раздел ще разгледаме как можем да започнем да използваме Unity Application Block в нашите приложения. Първата стъпка трябва да бъде инсталирането на Unity Application Block във вашата система. Най-лесният начин да инсталирате тази библиотека е чрез NuGet. За целите на тази илюстрация тук ще използваме проект за конзолно приложение. За да създадете първото приложение с помощта на Unity Application Block, изпълнете следните стъпки:

  1. Отворете Visual Studio IDE
  2. Създайте конзолен проект и го запишете с име
  3. Щракнете с десния бутон върху проекта в прозореца на Solution Explorer
  4. Изберете „Управление на NuGet пакети ...“
  5. Инсталирайте Unity NuGet Package Manager

Това е всичко, което трябва да направите, за да подготвите почвата да започнете да използвате Unity. Вече сте готови да използвате Unity Application Block във вашия проект.

Създаване и разрешаване на обектни зависимости с помощта на контейнер Unity

Можете да използвате контейнера Unity за лесно разрешаване на зависимости от определен обект, както е показано в кодовия фрагмент, който следва.

IUnityContainer container = new UnityContainer();

container.RegisterType();

container.RegisterType();

Когато регистрирате типа на обект с контейнера Unity, можете да посочите живота. Ако не посочите нито един, се използва животът по подразбиране. Доживотен мениджър контролира живота на регистриран обект. Типовете на мениджърите за цял живот, поддържани от блока за приложения на Unity, включват: TransientLifetimeManager, ContainerControllLifetimeManager, HierarchicalLifetimeManager, PerThreadLifetimeManager и ExternallyControllLifetimeManager.

Помислете за следния интерфейс, наречен ILogger.

public interface ILogger

   {

       string GetLogTypeName();

   }

Интерфейсът ILogger съдържа декларацията на един метод, наречен GetLogTypeName (). Класовете FileLoger, DatabaseLogger и EventLogger (дадени по-долу) реализират интерфейса ILogger.

public class FileLogger : ILogger

   {

       public string GetLogTypeName()

       {

           return "File Logger";

       }

   }

   public class DatabaseLogger: ILogger

   {

       public string GetLogTypeName()

       {

           return "Database Logger";

       }

   }

   public class EventLogger: ILogger

   {

       public string GetLogTypeName()

       {

           return "Event Logger";

       }

   }

Следният списък с кодове показва как можете да разрешавате зависимости, като използвате UnityContainer.

static void Main(string[] args)

{

IUnityContainer container = new UnityContainer();

container.RegisterType();

ILogger iLogger = container.Resolve();

string logType = iLogger.GetLogTypeName();

Console.WriteLine(logType);

Console.Read();

}

Обърнете внимание, че „Контейнерът“ в Unity Application Block е обектът, който може да се използва за създаване и инжектиране на зависимости. Можете да регистрирате типове или преобразувания на типове с контейнера Unity, използвайки метода RegisterType. Методът Resolve () се използва за връщане на конкретен екземпляр от типа, който е регистриран за родовия тип, споменат с помощта на T. В примера по-горе, методът Resolve () ще върне екземпляр на класа FileLogger.

Алтернативен подход за определяне на интеграцията на Unity е чрез конфигуриране. Ако приемем, че сте задали контейнер с име Container в конфигурацията на Unity, следният кодов фрагмент илюстрира как можете да извикате метода LoadConfiguration на екземпляра на контейнера във вашия код.

string containerName = "Container";

IUnityContainer container = new UnityContainer().LoadConfiguration(containerName);