161 votes

Est-ce que quelqu'un peut expliquer Microsoft Unity ?

J’ai lu les articles sur MSDN sur l’unité (Injection de dépendance, Inversion de contrôle), mais je pense que j’en ai besoin a expliqué en termes simples (ou des exemples simples). Je suis familier avec le modèle MVPC (nous utilisons ici), mais je ne peux pas saisir juste vraiment cette chose l’unité encore, et je pense que c’est la prochaine étape de notre conception de l’application.

179voto

Chris Holmes Points 5475

L'unité est juste un Cio "conteneur". Google StructureMap et de l'essayer à la place. Un peu plus facile à analyser, je pense que, lorsque le Cio choses est nouveau pour vous.

En gros, si vous comprenez Cio alors, vous comprenez que ce que vous faites est de l'inversion de la commande lorsqu'un objet est créé.

Sans Cio:

public class MyClass
{
   IMyService _myService; 

   public MyClass()
   {
      _myService = new SomeConcreteService();    
   }
}

Avec le Cio, le conteneur:

public class MyClass
{
   IMyService _myService; 

   public MyClass(IMyService myService)
   {
      _myService = myService;    
   }
}

Sans Cio, votre classe qui s'appuie sur la IMyService a à nouveau une version concrète du service à utiliser. Et ce qui est mauvais pour un certain nombre de raisons (que vous avez couplé votre classe à une version concrète de la IMyService, vous pouvez pas test unitaire facilement, vous ne pouvez pas le changer facilement, etc.)

Avec un conteneur IoC-vous à "configurer" le conteneur pour résoudre ces dépendances pour vous. Donc, avec un constructeur basé sur l'injection de régime, vous venez de passer à l'interface de la IMyService dépendance dans le constructeur. Lorsque vous créez le MyClass avec votre conteneur, le conteneur va résoudre le IMyService dépendance pour vous.

À l'aide de StructureMap, la configuration du conteneur ressemble à ceci:

StructureMapConfiguration.ForRequestedType<MyClass>().TheDefaultIsConcreteType<MyClass>();
StructureMapConfiguration.ForRequestedType<IMyService>().TheDefaultIsConcreteType<SomeConcreteService>();

Donc, ce que vous avez fait est dit le conteneur des, "Quand quelqu'un demande de l'IMyService, de leur donner une copie de la SomeConcreteService." Et vous avez également précisé que lorsque quelqu'un demande un MyClass, ils obtiennent un béton MyClass.

C'est tout un conteneur IoC fait vraiment. Ils peuvent faire plus, mais c'est la poussée de celui - ci- ils résoudre des dépendances pour vous, donc vous n'avez pas à (et vous n'avez pas à utiliser le "nouveau" mot-clé tout au long de votre code).

Dernière étape: lorsque vous créez votre MyClass, vous voulez faire cela:

var myClass = ObjectFactory.GetInstance<MyClass>();

Espérons que cela aide. N'hésitez pas à e-mail moi.

39voto

Kevin Hakanson Points 15498

Je viens de regarder les 30 minutes de l'Unité d'Injection de Dépendance Cio Screencast par David Hayden et senti que c'était une bonne explication avec des exemples. Voici un extrait de l'émission des notes:

La vidéo montre plusieurs usages communs de l'Unité du Cio, tels que:

  • La Création De Types Pas Dans Un Conteneur
  • L'enregistrement et la Résolution des TypeMappings
  • L'enregistrement et la Résolution Nommé TypeMappings
  • Les Singletons, LifetimeManagers, et la ContainerControlledLifetimeManager
  • L'Enregistrement De Toutes Les Instances Existantes
  • L'injection de Dépendances dans les Instances Existantes
  • Le remplissage de la UnityContainer via App.config / Web.config
  • Spécification des Dépendances par l'Injection de l'API, par opposition à la Dépendance des Attributs
  • À L'Aide De Imbriquée ( Parent-Enfant ) Conteneurs

32voto

Chad Moran Points 8560

L'unité est une bibliothèque comme beaucoup d'autres, qui vous permet d'obtenir une instance d'un type demandé, sans avoir à les créer vous-même. Donc, étant donné.

public interface ICalculator
{
    void Add(int a, int b);
}

public class Calculator : ICalculator
{
    public void Add(int a, int b)
    {
        return a + b;
    }
}

Vous devez utiliser une bibliothèque comme Unité pour vous inscrire Calculatrice pour être renvoyée lorsque le type ICalculator est demandé aka IoC (Inversion of Control) (cet exemple est théorique, n'est pas techniquement correct).

IoCLlibrary.Register<ICalculator>.Return<Calculator>();

Alors maintenant, quand vous voulez une instance d'un ICalculator vous...

Calculator calc = IoCLibrary.Resolve<ICalculator>();

Cio bibliothèques peuvent généralement être configurés de manière à maintenir un singleton ou créer une nouvelle instance à chaque fois que vous résoudre un type.

Maintenant, disons que vous avez une classe qui s'appuie sur une ICalculator d'être présent, vous pourriez avoir..

public class BankingSystem
{
    public BankingSystem(ICalculator calc)
    {
        _calc = calc;
    }

    private ICalculator _calc;
}

Et vous pouvez d'installation de la bibliothèque d'injecter un objet dans le constructeur au moment de sa création.

Afin de DI ou de l'Injection de Dépendance des moyens pour injecter un objet à un autre.

31voto

Ben Power Points 180

Ce mec WilcoxTutorials donne une excellente démonstration de la conteneur de l’unité qui est destiné aux débutants.

Partie 1 : http://www.youtube.com/watch?v=CWwe9Z0Gyew

Partie 2 : http://www.youtube.com/watch?v=PsIbevgzQQE

Dans moins de la moitié une heure et vous comprendrez l’essentiel !

10voto

Brian Rasmussen Points 68853

L'unité est un Cio. Le point de Cio est à l'abstrait le câblage des dépendances entre les types en dehors des types eux-mêmes. Cela a quelques avantages. Tout d'abord, il est fait de manière centrale, ce qui signifie que vous n'avez pas à changer beaucoup de code lorsque les dépendances changement (qui peut être le cas pour les tests unitaires).

En outre, si le câblage est effectué à l'aide des données de configuration au lieu de code, vous pouvez réellement rewire les dépendances après le déploiement, et donc de modifier le comportement de l'application sans modifier le code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X