2009-02-17 3 views
1

Je suis novice dans l'utilisation des concepts Unity et IoC/DI. J'ai commencé avec le concept en roulant le mien via le show de James Kovacs au dnrTV lors d'un test. Dans son exemple, Container s'exécutait en tant que singleton accédé via une méthode statique dans une classe IoC afin que vous puissiez enregistrer des types au démarrage et résoudre le type dans votre application.Shoud Je crée un objet IUnityContainer en utilisant un motif Singleton?

Je sais que ce n'était pas complet et devait principalement montrer les concepts de l'IoC.

Je tente maintenant d'utiliser Unity dans un projet.

Dans mon Main(), je crée un nouveau conteneur, mais une fois que mon WinForms s'ouvre, le conteneur tombe hors de la portée et est éliminé. Plus tard dans le programme, lorsque j'essaie de résoudre un type je n'ai plus le conteneur d'origine et ses types enregistrés.

Existe-t-il un concept ou une construction d'implémentation qui me manque?

Ma pensée actuelle est de créer quelque chose comme ceci:

public static class Container 
{ 
    private static readonly object syncRoot = new object(); 
    private static volatile IUnityContainer instance; 

    public static IUnityContainer Instance 
    { 
     get 
     { 
      if (instance == null) 
      { 
       lock (syncRoot) 
       { 
        if (instance == null) 
        { 
         instance = new UnityContainer(); 
        } 
       } 
      } 
      return instance; 
     } 
    } 
} 

Je suis assez sûr que cela fonctionne, il ne semble pas juste.

Merci,
Keith

Répondre

1

J'utilise une classe statique pour juste cette même raison - pour éviter de sortir du champ d'application.

La seule différence que je vous fais est que je conclurai tous les appels d'unité et d'ajouter des contrôles pour voir si l'unité est déjà configuré, comme vous le verrez ici:

using System.Configuration; 
using Microsoft.Practices.Unity; 
using Microsoft.Practices.Unity.Configuration; 

namespace Utilities 
{ 
    public static class ServiceLocator 
    { 
     private static IUnityContainer container = new UnityContainer(); 
     private static bool isConfigured; 

     public static void Clear() 
     { 
      container = new UnityContainer(); 
     } 

     private static IUnityContainer Container 
     { 
      get 
      { 
       if (!isConfigured) 
       { 
        ConfigureContainer(); 
       } 
       return container; 
      } 
     } 

     public static T Resolve<T>() 
     { 
      return Container.Resolve<T>(); 
     } 

     public static T Resolve<T>(string name) 
     { 
      return Container.Resolve<T>(name); 
     } 

     public static void AddInstance<T>(object instance) 
     { 
      Container.RegisterInstance(typeof (T), instance); 
     } 

     private static void ConfigureContainer() 
     { 
       UnityConfigurationSection section = (UnityConfigurationSection) ConfigurationManager.GetSection("unity"); 
       section.Containers.Default.Configure(container); 
       isConfigured = true;   
     } 
    } 
} 
+0

Merci, je ne configure pas mon conteneur dans la classe statique. Je pense que cela me donne la flexibilité de changer la configuration dans une situation de test sans avoir la configuration "production" automatiquement injectée quand elle est utilisée dans un test. –

+0

Assez juste. Bien sûr, avec les tests unitaires, vous n'avez pas besoin du conteneur. Je comprends cependant le besoin dans un scénario de test d'intégration. –

Questions connexes