Почему Регистр Unity <...> заставляет Unity возвращать несколько экземпляров? - PullRequest
3 голосов
/ 18 марта 2009

В документации 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"; }
    }
}

Ответы [ 2 ]

13 голосов
/ 18 марта 2009

Вы настроили свой контейнер с помощью 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()); 

В качестве альтернативы вы можете сохранить свою регистрацию с помощью 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());
4 голосов
/ 18 марта 2009

Я думаю, что если бы вы вызвали Resolve с IValidator в качестве параметра типа, это сработало бы так, как вы ожидаете:

...
var validator2 = container.Resolve<IValidator>();
...
...