인터페이스 주입 된 생성자에서 Unity의 자동 분사를 얻는 방법은 무엇입니까?

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

문제

Unity 문서는 다음과 같습니다.

Unity 컨테이너의 Resolve 메소드를 사용하여 개발자가 인스턴스화하는 클래스가 다른 클래스에 대해 하나 이상의 종속성을 정의하는 생성자가있는 경우 Unity 컨테이너는 종속 객체 인스턴스를 자동으로 생성합니다 생성자의 매개 변수로 지정됩니다

이것은 훌륭하지만 대부분은 지정하지 않습니다. 클래스 주사를 위해 인터페이스, 물건을 분리하기 위해.

그렇다면 내가 .resolve <> 일 때 Unity의 자동 주입을 어떻게 활용할 수 있습니까? 인터페이스 주입을 지정하는 클래스 계급 주입 대신?

즉 다음 코드에서 고객 생성자를 변경할 때 어떻게 작동하게 할 수 있습니까?공개 고객 (Ilogger Logger)"?

using System;
using Microsoft.Practices.Unity;

namespace TestUnityInjection23
{
    public class Program
    {
        static void Main(string[] args)
        {
            Customer customer1 = new Customer(new BasicLogger());
            //Customer customer2 = new Customer(new AdvancedLogger()); //can't use this since Customer only accepts BasicLogger

            UnityContainer container = new UnityContainer();
            container.RegisterType<Customer>();
            container.RegisterType<ILogger, BasicLogger>();
            Customer customer3 = container.Resolve<Customer>();

            Console.ReadLine();
        }
    }

    public class Customer
    {
        public Customer(BasicLogger logger) //would like to have Customer depend on ILogger here so logger can be swapped out
        {
            logger.WriteToLog("creating the customer");
        }
    }

    public interface ILogger
    {
        void WriteToLog(string text);
    }

    public class BasicLogger : ILogger
    {

        public void WriteToLog(string text)
        {
            Console.WriteLine(text);
        }
    }

    public class AdvancedLogger : ILogger
    {
        public void WriteToLog(string text)
        {
            Console.WriteLine("*** {0} ***", text);
        }
    }

}
도움이 되었습니까?

해결책

나는 Unity를 사용한 적이 없지만, 내가 아는 다른 모든 DI 프레임 워크는 그렇게하고 Unity도 그렇게해야한다고 확신합니다.

고객 생성자를 변경하고 작동하는지 확인해 보셨습니까? cos it.

다른 팁

너무 늦었는지 확실하지 않지만 생각합니다

사용 (iunityContainer Container = new UnityContainer ()) {container.registertype ();

            container
                .RegisterType<ILogger, BasicLogger>()
                .Configure<InjectedMembers>()
                .ConfigureInjectionFor<Customer>(new InjectionConstructor(typeof(BasicLogger)));

            var customer3 = container.Resolve<Customer>();
        }
        Console.ReadLine();


public class Customer
        {
            public BasicLogger Logger { get; set; }
            public Customer(ILogger logger) 
            {
                logger.WriteToLog("creating the customer");
            }
        }

트릭을 할 것입니다

제네릭을 사용하십시오

public interface ILogger<T> where T: class
{

}

public class BasicLogger:ILogger<BasicLogger>
{

}

public class AdvanceLogger:ILogger<AdvanceLogger>
{

}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top