我想在我的代码中只有一个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:解析 依赖失败,输入=&#34; SpotFinder.ViewModels.TestClass&#34;,name = &#34;(无)&#34;
在解析时发生异常。
异常是:InvalidOperationException - String类型不能 建造。您必须配置容器以提供此值。
在例外时,容器是:
解决SpotFinder.ViewModels.TestClass,(无)
解析参数&#34; str&#34;构造函数SpotFinder.ViewModels.TestClass(System.String str)
解析System.String,(无)
我也尝试过这样注册:
unityContainer.RegisterType<TestClass>(new InjectionConstructor(
new InjectionParameter("Injected string"))
);
答案 0 :(得分:0)
您使用UnityContainer
未获得GetService(typeof(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);
P.S。我不建议您使用ServiceLocator
,您可以查看他的advantages/disadvantages