본문 바로가기

IT 살이/04. 기술 - 프로그래밍

개발 프레임워크 만들기 대장정 12- Property(setter) Injection

앞의 포스트에서 Unity 컨테이너가 사용하는 dependency injection중에서 constructor injection에 대해서 알아봤다. 이제 두번째로 Property Injection에 대해서 알아보자.

● Dependency 어트리뷰트 사용

property에 dependency injection 표시는 다음과 같다.

public class MyObject

{

    private SomeOtherObject _dependentObject;


    [Dependency]

    public SomeOtherObject DependentObject

    {

        get { return _dependentObject; }

        set { _dependentObject = value; }

    }

}

코드처럼 Property에 Dependency 어트리뷰트를 붙여두면 된다.  대상 클래스 MyObject의 DependentObject 속성은 외부 타입 SomeOtherObject에 의존하고 있다는 것을 보여주고 있다. Property에는 getter 메소드와 setter 메소드가 있다. 가릿? OK! 이중에서 Dependency 표시가 적용되는 것은 setter 메소드이다. Unity 컨테이너가 이 타입 MyObject 의 인스턴스를 생성할때(!!) Dependency 어트리뷰트가 붙어 있는 속성을 확인해서 해당 속성에서 사용하는 외부의 의존 타입의 객체를 미리 생성해서 setter 메소드를 통해서 내부에 참조를 저장해둔다. 그런 다음 대상 객체의 인스턴스를 반환한다.

이 상황을 다시 한번 느긋하게 생각해보자. Unity 컨테이너가 대상 객체에 대한 인스턴스를 코드로 반환할때는 이미 대상 객체는  필요로 하는 외부 객체들에 참조를 모두 갖추어서 초기화가 완전히 된 상태인 것이다. 대상 타입 MyObject 가 인스턴스가 될때는 이제 독립적인 상태가 되어 있는 것이다.  좀 더 독립적인 객체 지향적이라는 느낌이 오지 않나? 아님 말고.

이제 이 객체를 사용하는 코드를 보자.

IUnityContainer uContainer = new UnityContainer();

MyObject myInstance = uContainer.Resolve<MyObject>();


// 이제 종속 객체를 가지고 있는 속성에 접근한다.

SomeOtherObject depObj = myInstance.DependentObject;

내부의 _dependentyObject를 초기화한 코드는 없다. 컨테이너가 MyObject를 생성할때 Dependency 어트리뷰트가 붙어있는 속성을 확인하고 나서 그 속성에서 필요로 하는 SomeOtherObject 타입의 _dependentObject를 초기화해준다. 개발자는 이제 속성을 호출해서 SomeOtherObject 인스턴스를 사용하면 된다.

Dependency 어트리뷰트가 붙은 속성의 반환값의 타입이 인터페이스나 베이스 클래스일 수도 있다. 이 경우 Unity 컨테이너는 이 베이스 타입이 컨테이너에 등록되어있는지를 확인하고 그 실제 타입의 객체를 생성해서 inject한다. 가릿?