2017-07-15 1 views
0

Je souhaite avoir une seule instance de TestClass dans mon code. Cette classe nécessite un paramètre de chaîne. La question est que, comment puis-je inscrire cet objet à l'unité conteneur avec un paramètre de chaîne une fois dans la classe UnityConfig, puis résoudre cet objet partout dans le code? Je l'ai essayé comme ça mais pendant la résolution je reçois l'exception.Conteneur Unity - Résoudre un objet qui a toujours le même paramètre constructeur

C'est ma classe:

public class TestClass 
    { 
     public TestClass(string str) 
     { 
      message = str; 
     } 

     private string message; 

     public string Message 
     { 
      get => message; 
      set 
      { 
       message = value; 
      } 
     } 
    } 

Et voici ma UnityConfig classe:

public class UnityConfig 
    { 
     private readonly UnityContainer unityContainer; 

     public UnityConfig() 
     { 
      unityContainer = new UnityContainer(); 
      unityContainer.RegisterType<TestClass>(new InjectionConstructor("Injected string")); 
      var unityServiceLocator = new UnityServiceLocator(unityContainer); 
      ServiceLocator.SetLocatorProvider(() => unityServiceLocator); 
     } 
    } 

Je le résoudre comme ceci:

var serviceLocator = (UnityServiceLocator)ServiceLocator.Current; 
var unityContainer = (UnityContainer)serviceLocator.GetService(typeof(UnityContainer)); 
var testClass = unityContainer.Resolve<TestClass>(); 

et je reçois ce exception:

Exception non gérée:

Microsoft.Practices.Unity.ResolutionFailedException: Résolution de la dépendance a échoué, type = "SpotFinder.ViewModels.TestClass", name = "(aucun)".

Une exception est survenue pendant la résolution.

Exception est: InvalidOperationException - La chaîne de type ne peut pas être construit. Vous devez configurer le conteneur pour fournir cette valeur.


Au moment de l'exception, le conteneur était:

Résolution SpotFinder.ViewModels.TestClass, (none)
paramètre Résoudre "str" ​​du constructeur SpotFinder.ViewModels.TestClass (System.String str)
Résolution System.String, (none)

J'ai essayé aussi enregistrer comme ceci:

unityContainer.RegisterType<TestClass>(new InjectionConstructor(
       new InjectionParameter("Injected string")) 
      ); 
+0

Pourquoi ne pas simplement créer un objet de classe statique initialisé avec le constructeur? n'est-ce pas plus facile? –

Répondre

0

Vous obtenez une nouvelle instance de UnityContainer en utilisant GetService(typeof(UnityContainer)) qui n'a pas l'enregistrement TestClass, donc il vous donne une exception lors de la résolution. Il suffit d'utiliser directement serviceLocator pour résoudre TestClass. Il ressemble à ceci:

var serviceLocator = (UnityServiceLocator)ServiceLocator.Current; 
var testClass = serviceLocator.GetService(typeof(TestClass)); 

et inscription:

var unityContainer = new UnityContainer(); 
// Configure only one instance of testclass 
unityContainer.RegisterType<TestClass>(new ContainerControlledLifetimeManager(), new InjectionConstructor("Injected string")); 
var unityServiceLocator = new UnityServiceLocator(unityContainer); 
ServiceLocator.SetLocatorProvider(() => unityServiceLocator); 

post-scriptum Je ne vous suggère pas d'utiliser ServiceLocator, vous pouvez regarder son advantages/disadvantages