2009-03-18 3 views
2

유니티 문서 상태 :Unity의 자동 주입이 인터페이스 삽입 생성자에서 작동하도록하는 방법은 무엇입니까?

개발자들이 유니티 컨테이너의 해결 방법을 사용하여 을 인스턴스화하는 클래스는 이 다른 클래스, 유니티 컨테이너 에 하나 이상의 종속성을 정의하는 생성자가있는 경우 종속 객체를 자동으로 생성합니다.은 으로 지정됩니다.

,210

이 매우 중요하지만, 분리 된 일을 유지하기 위해 가장 자주, 클래스 주입을위한하지만 인터페이스를 지정하지 마십시오.

그렇다면 유니티의 자동 주입 기능을 활용하려면 어떻게해야합니까? <>클래스 삽입 대신 인터페이스 주입을 지정하는 클래스를 작성하면 어떻게됩니까?

즉, 다음 코드에서 고객 생성자를 "공개 고객 (ILogger 로거)"으로 변경하면 어떻게 작동합니까?

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

} 

답변

1

내가 유니티를 사용한 적이 있지만, 내가 아는 모든 다른 DI 프레임 워크가을 수행하고 내가 유니티가 너무 것을해야 확신합니다.

Customer 생성자를 변경하고 작동하는지 확인해 보셨습니까? 그렇게해야합니다.

+0

나는, 문제는 나는 물론 아무튼 "container.RegisterType ()"를 시도했던 것을 할 경우 예 작동합니까 BasicLogger 또는 AdvancedLogger를 런타임에 주입해야하는지 지정하십시오. 나는 용기가 어떻게 사용할 것인지 결정할 것인지 궁금해했다. –

1

확실하지 너무 늦게하지만 내가 사용

생각 (IUnityContainer 컨테이너를 = 새로운 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"); 
      } 
     } 

트릭

0

사용을 할 것입니다 일반적인

public interface ILogger<T> where T: class 
{ 

} 

public class BasicLogger:ILogger<BasicLogger> 
{ 

} 

public class AdvanceLogger:ILogger<AdvanceLogger> 
{ 

} 
관련 문제