카테고리 없음

MVVM에서 IoC의 중요성

wafe 2011. 10. 18. 09:21
MVVM 패턴을 사용할 때 초기화하는 패턴만 대략 10가지 정도의 패턴이 있습니다. 그중에 Expression Blend와 VisualStudio의 디자인 타임에 잘 보이게 하려면 리소스에 ViewModel Locator를 넣는게 가장 좋습니다.

당연히 중복을 피하고 싶고 컨트롤마다 로케이터가 생성될 필요는 없으니 Window나 UserControl 모두에 Locator 리소스를 넣기보다는 App의 리소스(글로벌 리소스)에 넣는 방법이 먼저 시도되는 것이 바람직합니다.

그런데 여기서 디자인타임 지원에 문제가 생깁니다. Blend에서 윈도우나 사용자컨트롤에 포함되어 있는 사용자컨트롤을 생성할 때, 글로벌 리소스에는 접근할 수가 없는거죠. 검색을 좀 해보면 이것을 Blend의 버그로 보는 경향이 많습니다. 몇가지 해결책도 제시하고 있는데 완벽하지는 않습니다.

결국 컨트롤마다 XAML의 리소스 사전에 로케이터를 정의하는 방식으로 선회할 수 밖에 없었습니다. 이때 우리를 구해준 것이 IoC 컨테이너였습니다. MVVM Light를 사용하는 프로젝트라서 사실은 이미 SimpleIoc라는 내장 IoC 컨테이너가 사용되고 있는 상황이었지요.

IoC 컨테이너 자체가 이미 싱글턴이고, 이 싱글턴 인스턴스가 하는 일은 사용자가 등록해둔 타입별 인스턴스를 관리하는 일입니다. 즉 프로그램의 어느 부분에서나 쓰고 싶은 타입만 지정하면 그 타입의 동일한 인스턴스를 얻을 수 있다는 거죠.

그래서 ViewModel Locator를 모든 컨트롤에서 매번 생성하는게 아무 문제 없는 거였습니다.

MVVM 패턴을 쓸 때 걱정했던 부분이 패턴 자체의 학습 곡선이었습니다. 그리고 부가적으로 따라올 것처럼 보이는 다른 패턴들에 대한 학습이었습니다. 확실히 학습에 시간을 좀 더 쓰게 되는 것 같기는 합니다. 하지만 다행히 MVVM Light 프레임워크가 적절한 수준에서 문제 범위가 너무 커지는 걸 막아주었다는 생각이 듭니다.

iPhone 에서 작성된 글입니다.