统一容器 - 解析对象总是相同的构造函数参数
问题描述:
我想在我的代码中只有一个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"))
);
答
您使用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
为什么不只是一个静态的类对象与构造函数初始化?那会更容易吗? –