统一容器 - 解析对象总是相同的构造函数参数

问题描述:

我想在我的代码中只有一个TestClass的实例。这个类需要字符串参数。问题是,如何在UnityConfig类中将此对象注册到带有字符串参数的统一容器中,然后在代码中的任何位置解析此对象?我尝试这样,但在解决我得到异常。统一容器 - 解析对象总是相同的构造函数参数

这是我的课:

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

     private string message; 

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

这是我UnityConfig类:

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); 
     } 
    } 

我解决这样的:

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

,然后我得到这个例外:

未处理的异常:

Microsoft.Practices.Unity.ResolutionFailedException:所述 依赖性的解析失败,类型= “SpotFinder.ViewModels.TestClass”,名字= “(无)”。

发生异常时:解决。

异常是:InvalidOperationException - 类型字符串不能是 构造。您必须配置容器以提供此值。


在异常时,该容器是:

解决SpotFinder.ViewModels.TestClass,(无)
解决构造SpotFinder.ViewModels.TestClass的参数 “STR”(System.String STR)
解决System.String,(无)

我试着也这样注册:

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

为什么不只是一个静态的类对象与构造函数初始化?那会更容易吗? –

您使用GetService(typeof(UnityContainer))获得UnityContainer的新实例,该实例没有TestClass注册,所以它在解析期间会给您一个例外。直接使用serviceLocator来解析TestClass。它看起来像这样:

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

和登记:

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); 

附:我不建议你使用ServiceLocator,你可以看看他的一些advantages/disadvantages