Lavorare con Unity Application Block

Simile a Castle Windsor e StructureMap, Unity Application Block è anche un contenitore IoC (Inversion of Control). Unity Application Block di Microsoft è un contenitore di inserimento delle dipendenze estensibile leggero. Fornisce supporto per l'iniezione nel costruttore, l'iniezione di proprietà e anche l'iniezione di chiamate di metodo. Per inciso, Unity Application Block è stato introdotto come parte della Enterprise Library.

Nel caso in cui non hai familiarità con ciò che riguarda l'iniezione di dipendenza e l'inversione del controllo, ecco una rapida spiegazione. Dependency Injection è una realizzazione del principio IoC. Sia l'inversione del controllo che l'inserimento delle dipendenze sono modi che consentono di interrompere le dipendenze tra i componenti nell'applicazione. Il principio di Dependency Injection afferma che i moduli di alto livello in un'applicazione non dovrebbero dipendere dai moduli di basso livello; piuttosto, entrambi dovrebbero dipendere dalle astrazioni.

Obiettivi di progettazione di Unity Application Block

Unity Application Block è un contenitore DI (Dependency Injection). Si noti che Unity Application Block non ha alcuna dipendenza dal sistema di configurazione di Enterprise Library. Pertanto, è possibile utilizzarlo come contenitore di inserimento delle dipendenze autonomo senza la Enterprise Library installata nel sistema. Gli obiettivi di progettazione di Unity Application Block includono quanto segue:

  1. Promuovere un design modulare attraverso il disaccoppiamento
  2. Fornire un contenitore di iniezione delle dipendenze veloce, estensibile e leggero
  3. Fornire supporto per l'estensibilità tramite estensioni
  4. Fornire supporto per l'iniezione guidata dagli attributi
  5. Fornire supporto per un'API intuitiva a cui connettersi e lavorare con il contenitore di inserimento delle dipendenze

Iniziare

In questa sezione esploreremo come iniziare a utilizzare Unity Application Block nelle nostre applicazioni. Il primo passo dovrebbe essere quello di installare Unity Application Block nel tuo sistema. Il modo più semplice per installare questa libreria è tramite NuGet. Per gli scopi di questa illustrazione useremo qui un progetto di applicazione console. Per creare la prima applicazione utilizzando Unity Application Block, segui questi passaggi:

  1. Apri l'IDE di Visual Studio
  2. Crea un progetto console e salvalo con un nome
  3. Fare clic con il pulsante destro del mouse sul progetto nella finestra Esplora soluzioni
  4. Seleziona "Gestisci pacchetti NuGet ..."
  5. Installa Unity NuGet Package Manager

Questo è tutto ciò di cui hai bisogno per preparare il terreno per iniziare a utilizzare Unity. Ora sei pronto per utilizzare Unity Application Block nel tuo progetto.

Creazione e risoluzione delle dipendenze degli oggetti utilizzando Unity container

È possibile utilizzare il contenitore Unity per risolvere facilmente le dipendenze su un particolare oggetto, come mostrato nello snippet di codice che segue.

IUnityContainer container = new UnityContainer();

container.RegisterType();

container.RegisterType();

Quando registri il tipo di un oggetto con il contenitore Unity, puoi specificare la durata. Se non ne specifichi nessuno, viene utilizzata la durata predefinita. Un Lifetime Manager controlla la durata di un oggetto registrato. I tipi di Lifetime Manager supportati da Unity Application Block includono: TransientLifetimeManager, ContainerControlledLifetimeManager, HierarchicalLifetimeManager, PerThreadLifetimeManager ed ExternallyControlledLifetimeManager.

Considera la seguente interfaccia chiamata ILogger.

public interface ILogger

   {

       string GetLogTypeName();

   }

L'interfaccia ILogger contiene la dichiarazione di un metodo denominato GetLogTypeName (). Le classi FileLoger, DatabaseLogger ed EventLogger (fornite di seguito) implementano l'interfaccia 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";

       }

   }

L'elenco di codice seguente mostra come risolvere le dipendenze utilizzando 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();

}

Si noti che il "Contenitore" in Unity Application Block è l'oggetto che può essere utilizzato per creare e inserire dipendenze. È possibile registrare tipi o mappature di tipi con il contenitore Unity utilizzando il metodo RegisterType. Il metodo Resolve () viene utilizzato per restituire un'istanza concreta del tipo registrato per il tipo generico menzionato utilizzando T. Nell'esempio di codice riportato sopra, il metodo Resolve () restituirà un'istanza della classe FileLogger.

Un approccio alternativo per specificare l'integrazione di Unity è tramite la configurazione. Supponendo di aver specificato un contenitore denominato Container nella configurazione di Unity, il frammento di codice seguente illustra come chiamare il metodo LoadConfiguration sull'istanza del contenitore nel codice.

string containerName = "Container";

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