为什么Unity的RegisterInstance <...>事业团结返回多个实例?
-
19-08-2019 - |
题
统一的文档,其登记一个实例RegisterInstance <>方法的说,使得的返回的特定实例每次解决<>被称为即可。
然而,下面这个例子中示出了每个时间解决<>被调用时,的返回的类型的新实例强>
这是为什么?
using System;
using System.Windows;
using Microsoft.Practices.Unity;
namespace TestUnity34
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
Validator validator1 = new Validator();
IUnityContainer container = new UnityContainer();
container.RegisterInstance<IValidator>(validator1);
Validator validatorCopied = validator1;
Console.WriteLine(validator1.GetHashCode()); //14421545
Console.WriteLine(validatorCopied.GetHashCode()); //14421545
Validator validator2 = container.Resolve<Validator>();
Console.WriteLine(validator2.GetHashCode()); //35567111
Validator validator3 = container.Resolve<Validator>();
Console.WriteLine(validator3.GetHashCode()); //65066874
}
}
interface IValidator
{
void Validate();
string GetStatus();
}
public class Validator : IValidator
{
public void Validate() { }
public string GetStatus() { return "test"; }
}
}
解决方案
您已经配置了IValidator您的容器,这样你将不得不使用IValidator而不是验证解决:
Validator validator1 = new Validator();
IUnityContainer container = new UnityContainer();
container.RegisterInstance<IValidator>(validator1);
Validator validatorCopied = validator1;
Console.WriteLine(validator1.GetHashCode());
Console.WriteLine(validatorCopied.GetHashCode());
IValidator validator2 = container.Resolve<IValidator>();
Console.WriteLine(validator2.GetHashCode());
IValidator validator3 = container.Resolve<IValidator>();
Console.WriteLine(validator3.GetHashCode());
另外,你可以保持您的注册使用验证但你必须使用验证,以及解决:
Validator validator1 = new Validator();
IUnityContainer container = new UnityContainer();
container.RegisterInstance<Validator>(validator1);
Validator validatorCopied = validator1;
Console.WriteLine(validator1.GetHashCode());
Console.WriteLine(validatorCopied.GetHashCode());
Validator validator2 = container.Resolve<Validator>();
Console.WriteLine(validator2.GetHashCode());
Validator validator3 = container.Resolve<Validator>();
Console.WriteLine(validator3.GetHashCode());
其他提示
我觉得如果你有IValidator称为解析作为类型参数,因为你希望它会工作:
...
var validator2 = container.Resolve<IValidator>();
...
不隶属于 StackOverflow