본문 바로가기

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

개발 프레임워크 만들기 대장정 13- Method Call Injection

앞의 Construction InjectionSetter Property Injection 포스트를 읽었다면, Method Call Injection이라는 것도 메소드를 호출할때 메소드 파라미터를 ? Unity 컨테이너가? 하는 예상을 할 수도 있겠다. 그렇지 않은가? 아님 말고.

● InjectionMethod 어트리뷰트

InjectionMethod 어트리뷰트가 붙은 샘플 코드이다.

public class MyObject

{


    public IMyInterface depObjectA;

    public MyBaseClass depObjectB;


    [InjectionMethod]

    public void Initialize(IMyInterface interfaceObj, MyBaseClass baseObj)

    {

        depObjectA = interfaceObj;

        depObjectB = baseObj;

    }


}

"코드가 Initialize() 메소드를 호출할때 두개의 인자 IMyInterface, MyBaseClass 타입이 컨테이너에 등록되어 있는지를 확인하고 그것의 실제 타입의 인스턴스를 생성해서 파라미터로 inject시켜 호출해준다"라고 상상했는가? OK! 그러나 그것이 다는 아니다. InjectionMethod 어트리뷰트가 붙은 메소드는 컨테이너에서 자동으로 호출도 해준다. 코드가 MyObject 객체를 원할때 컨테이너는 이 객체를 생성한 후 InjectionMethod 어트리뷰트가 붙은 메소드도 자동으로 호출해준다. 이때 필요하다면 파라미터도 자동으로 생성해서 메소드 호출을 수행한다.

다음 코드를 보면 IMyInterface <-> FirstObject, MyBaseClass<-> SecondObject 타입 매핑 정보를 컨테이너에 등록하고 나서, 컨테이너의 Resolve<>()를 통해서 MyObject객체를 생성하고 있다.

IUnityContainer uContainer = new UnityContainer()

   .RegisterType<IMyInterface, FirstObject>()

   .RegisterType<MyBaseClass, SecondObject>();

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


// 이제 종속 객체에 대한 참조를 가지고 있는 공개 변수에 접근할 수 있다.

IMyInterface depObjA = myInstance.depObjectA;

MyBaseClass depObjB = myInstance.depObjectB;

그러고 나서 공개 변수 depObjectA와 depObjectB에 바로 접근하고 있다. 이렇게 해도 두 변수는 null을 반환하지 않는다는 것이다. MyObject 객체가 코드에 반환되기전에 즉 uContainer.Resolve<MyObject>() 내부에서 MyObject 객체를 반환하기 전에 그 객체의 InjectMethod 어트리뷰트가 붙은 Initialize() 메소드를 호출해서 두 변수를 초기화하고 나서이기 때문이다.  필요하다면 프레임워크 사용자가 다시 Initialize() 직접 호출할 수도 있을 것이다. 두번 호출되는 것이 마음에 안든다면 InjectionMethod 어트리뷰트를 제거해서 프레임워크의 사용자에게 직접 Initialize()를 호출하도록 할 수도 있다. 가릿? 선택의 폭은 이전보다 넓어졌다. 프레임워크 입장에서는 여러 가능성에 대비할 수 있는 능력이 있다는 것은 좋은 일이다. OK!

지금까지 Unity 컨테이너에서 사용하고 있는 세 종류의 Dependecy Injection에 대해서 알아봤다. 모두 반복인적 코드를 업무 개발자들이 아닌 프레임워크단에서 처리해준다는 면에서 필자의 마음에 꼬옥 드는 패턴이다. 지난 포스트에서 말한 것처럼 이제 다음 시간에는 Unity를 확장한다는 것이 무엇이고 확장을 하는 구체적인 방법을 알아보고 싶다. 그러나 이 부분에 대해서는 필자도 조금 공부를 해야 할 것 같다.