[英]Unity container - resolve object which always same constructor parameter
我想在我的代码中只有一个TestClass实例。 此类需要字符串参数。 问题是,如何在UnityConfig类中使用字符串参数将该对象注册到unity容器一次,然后在代码中的任何地方解析该对象? 我这样尝试过,但是在解决过程中却遇到异常。
这是我的课:
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-无法构造类型String。 您必须配置容器以提供该值。
在发生异常时,容器为:
解决SpotFinder.ViewModels.TestClass,(无)
解析构造函数SpotFinder.ViewModels.TestClass(System.String str)的参数“ str”
解析System.String,(无)
我试过也这样注册:
unityContainer.RegisterType<TestClass>(new InjectionConstructor(
new InjectionParameter("Injected string"))
);
您会使用未注册TestClass
GetService(typeof(UnityContainer))
获得UnityContainer
新实例,因此在解析过程中会出现异常。 只需直接使用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);
PS我不建议您使用ServiceLocator
,您可以看看他的一些优缺点
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.