Unity的文档说明了注册实例的RegisterInstance <>方法,以便每次调用Resolve <>时返回该特定实例.
但是,下面的示例显示每次调用Resolve <>时,都会返回该类型的新实例.
为什么是这样?
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"; }
}
}
Run Code Online (Sandbox Code Playgroud)
Jak*_*sen 13
您已使用IValidator配置容器,因此您必须使用IValidator而不是Validator来解决:
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());
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用Validator保持注册,但之后您还必须使用Validator解决:
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());
Run Code Online (Sandbox Code Playgroud)