Unity의 RegisterInstance <…>가 왜 Unity가 여러 인스턴스를 반환하게합니까?

StackOverflow https://stackoverflow.com/questions/658110

  •  19-08-2019
  •  | 
  •  

문제

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"; }
    }
}
도움이 되었습니까?

해결책

You have configured your container with IValidator so you will have to resolve using IValidator instead of 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()); 

Alternatively you can keep your registration using Validator but then you have to resolve using Validator as well:

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());

다른 팁

I think if you called Resolve with IValidator as the type parameter, it would work as you expect:

...
var validator2 = container.Resolve<IValidator>();
...
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top