간단한 애플릿 프리젠테이션 Unity의 3가지 종속 주입 방식

5138 단어 Asp.net
오늘'WCF 기술 분석(권2)'에 관한 장을 써서'WCF 확장을 통해 IoC 프레임워크(Unity를 예로 들면)와 통합하는 방법'('자정의 서비스 호스트를 통해 WCF에 대한 확장을 실현하는 방법[실례편])의 예를 들었다.Unity가 몇 가지 전형적인 주입 방식(구조기 주입, 속성 주입과 방법 주입)을 어떻게 실현하는지 보여주기 위해 나는 간단한 작은 프로그램을 썼다.만약 독자들이 Unity나 IoC에 대해 개념이 많지 않다면, 나는 이 작은 프로그램이 너에게 그것들을 초보적으로 인식하는 데 어느 정도 도움이 될 것이라고 생각한다.Unity나 IoC에 대해 깊이 있는 인식을 가지고 있다면 본문을 무시하십시오.[소스 코드는 여기서 다운로드합니다.]
먼저 컨트롤러 프로그램을 만들고 다음 두 개의 Unity 기반 프로그램 집합을 추가합니다: Microsoft.Practices.Unity.dll 및 Microsoft.Practices.Unity.Configuration.dll.그런 다음 다음과 같은 인터페이스(IA, IB, IC 및 ID)와 각각의 실현 클래스(A, B, C, D)를 정의합니다.유형 A에는 인터페이스 IB, IC, ID 등 3개의 속성 B, C 및 D가 정의되어 있습니다.그 중에서 속성 B는 함수에서 초기화된다.속성 C에 Microsoft가 적용됩니다.Practices.Unity.DependencyAttribute 특성은 속성 주입 방식으로 초기화되어야 하는 의존 속성임을 의미한다.속성 D는 Microsoft가 적용된 메서드 Initialize를 통해 초기화됩니다.Practices.Unity.InjectionMethodAttribute 는 주입 방법이 자동으로 호출된다는 것을 의미합니다.
   1: namespace UnityDemo
   2: {
   3:     public interface IA { }
   4:     public interface IB { }
   5:     public interface IC { }
   6:     public interface ID {}
   7:  
   8:     public class A : IA
   9:     {
  10:         public IB B { get; set; }
  11:         [Dependency]
  12:         public IC C { get; set; }
  13:         public ID D { get; set; }
  14:  
  15:         public A(IB b)
  16:         {
  17:             this.B = b;
  18:         }
  19:         [InjectionMethod]
  20:         public void Initialize(ID d)
  21:         {
  22:             this.D = d;
  23:         }
  24:     }
  25:     public class B: IB{}
  26:     public class C: IC{}
  27:     public class D: ID{}
  28: }

그런 다음 애플리케이션에 대한 구성 파일을 추가하고 다음 Unity 구성 섹션을 정의합니다.이 설정에서defaultContainer라는 Unity 용기를 정의하고 위에서 정의한 인터페이스와 대응하는 실행 클래스 사이의 매핑 유형이 일치합니다.
  1: 
   2: 
   3:   
   4:     
5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
最后在Main方法中编写如下的程序:创建一个代表IoC容器的UnityContainer对象,并加载配置信息对其进行初始化。然后调用它的泛型的Resolve方法创建一个实现了泛型接口IA的对象。最后将返回对象转变成类型A,并检验其B、C和D属性是否是空。


   1: static void Main(string[] args)
   2: {
   3:     IUnityContainer container = new UnityContainer();
   4:     UnityConfigurationSection configuration = (UnityConfigurationSection)ConfigurationManager.GetSection(UnityConfigurationSection.SectionName);
   5:     configuration.Configure(container, "defaultContainer");
   6:     A a = container.Resolve() as A;
   7:     if (null != a)
   8:     {
   9:         Console.WriteLine("a.B == null ? {0}", a.B == null ? "Yes" : "No");
  10:         Console.WriteLine("a.C == null ? {0}", a.C == null ? "Yes" : "No");
  11:         Console.WriteLine("a.D == null ? {0}", a.D == null ? "Yes" : "No");
  12:     }
  13: }

다음과 같은 실행 결과에서 우리는 다음과 같은 결론을 얻을 수 있다. Resolve 방법을 통해 되돌아오는 것은 A 유형의 대상이다.이 대상의 세 가지 속성이 효과적으로 초기화되었다.이 간단한 프로그램은 인터페이스 주입(상응하는 인터페이스를 통해 설정에 따라 상응하는 실현 유형을 해석), 구조기 주입(속성 B), 속성 주입(속성 C)과 방법 주입(속성 D)을 각각 구현했다.
   1: a.B == null ? No
   2: a.C == null ? No
   3: a.D == null ? No

IoC/DI 정보
제어 반전(IoC: Inversion Of Control)이란 응용 프로그램 자체가 의존 대상의 창설과 유지보수를 책임지지 않고 외부 용기에 맡기는 것이다.이렇게 하면 제어권이 응용에서 외부 IoC 용기로 옮겨지고 제어권은 이른바 반전을 실현한다.예를 들어 유형 A에서 유형 B의 실례를 사용해야 하는데 B 실례의 생성은 A가 책임지지 않고 외부 용기를 통해 만들어진다.
때때로 우리는 IoC를 의존 주입(DI:Dependency Injection)으로 만듭니다.의존 주입이란 외부 용기가 운행할 때 의존 대상을 구성 요소에 동적으로 주입하는 것이다.구체적인 의존 주입 방식은 다음과 같은 세 가지 전형적인 형식을 포함한다.
구조자 주입(Constructor Injection): IoC 컨테이너는 의존하는 객체를 만들기 위해 적합한 구조 함수를 지능적으로 선택하고 호출합니다.선택한 구조 함수에 해당하는 매개 변수가 있으면 IoC 용기는 구조 함수를 호출하기 전에 해당하는 매개 변수 대상을 사용자 정의로 만들 수 있습니다
속성 주입(Property Injection): 의존 대상의 어떤 속성을 사용해야 한다면 의존 대상이 만들어진 후에 IoC 용기는 자동으로 이 속성을 초기화합니다
메소드 주입(Method Injection): 종속 객체가 해당 메소드를 호출하여 초기화할 경우 해당 객체가 작성되면 IoC 컨테이너가 자동으로 메소드를 호출합니다
개원 지역사회에서 매우 유행하는 IoC 프레임워크를 가지고 있는데 예를 들어 캐슬 윈도우, Unity, Spring이다.NET, StructureMap, Ninject 등.

좋은 웹페이지 즐겨찾기