도움말 번역입니다



부트스트래퍼란 무엇인가?




부트스트래퍼Bootstrapper란 프리즘 라이브러리를 사용하여 빌드된 응용프로그램의 초기화에 책임이 있는 클래스입니다. 부트스트래퍼를 사용함으로써, 당신은 프리즘 라이브러리 컴포넌트들이 응용프로그램과 연결되는 방식을 더 많이 제어할 수 있습니다.


프리즘 라이브러리는 기본 추상 Bootstraper 기저 클래스를 포함하는데, 이는 다른 컨테이너들을 사용하기 위해서 특수화될 수도 있습니다. 부트스트래퍼 클래스들 상의 많은 메서드들은 가상 함수입니다. 당신은 이러한 메서드들을 당신만의 커스텀 부트스트래퍼 구현을 위해 적절하게 재정의할 수 있습니다.



프리즘 라이브러리는 몇 개의 부가적인 기저 클래스들을 제공하는데, 이것들은 Bootstrapper 를 상속합니다. 그리고 대부분의 응용프로그램들에 적합한 기본 구현들을 가지고 있습니다. 당신의 응용프로그램 부트스트래퍼에서 구현하도록 남겨진 스테이지는 쉘을 생성하고 초기화하는 것 뿐입니다.


의존성 주입Dependency Injection



프리즘 라이브러리를 사용해 빌드된 응용프로그램들은 컨테이너가 제공하는 의존성 주입에 의존합니다. 이 라이브러리는 유니티 응용프로그램 블락( Unity Application Block, Unity )이나 관리되는 확장성 프레임워크( Managed Extensibility Framework, MEF ) 를 사용해 동작하는 어셈블리들을 제공하며, 그것은 당신이 다른 의존성 주입 컨테이너들을 사용하는 것을 허용해 줍니다. 부트스트래핑 과정 중의 일부는 이 컨테이너를 구성하고 컨테이너에 타입들을 등록하는 것입니다.


프리즘 라이브러리는 UnityBootstrapperMefBootstrapper 클래스들을 포함하는데, 이것들은 Unity 나 MEF 를 사용하기 위해서 필요한 거의 대부분의 기능들을 당신의 응용프로그램 내의 의존성 주입 컨테이너로서 구현합니다. 이전 그림에서 보여 준 이 스테이지와는 별개로, 각 부트스트래퍼들은 자신의 컨테이너가 무엇이냐에 따라 몇 개의 단계를 추가합니다.


Shell 생성하기



일반적인 윈도우즈 프리젠테이션 파운데이션( Windows Presentation Foundation, WPF ) 응용프로그램에서, 메인 윈도우를 띄우는 App.xaml 파일에서 스타트업 통합 리소스 식별자( Uniform Resource Identifier, URI )가 지정됩니다. 실버라이트 응용프로그램에서는, 응용프로그램상의 RootVisual  속성이 App.xaml 파일의 코드 비하인드에서 설정됩니다.


프리즘 라이브러리를 사용해서 생성된 응용프로그램에서, 쉘이나 메인 윈도우를 생성하는 책임은 부트스트래퍼에게 있습니다. 그것은 쉘이 영역 관리자Region Manager와 같은 서비스들에 의존하며, 그것들은 쉘이 디스플레이되기 전에 등록될 필요가 있기 때문입니다.


중요한 결정들



응용프로그램에서 프리즘 라이브러리를 사용하겠다고 결정한 후에, 몇 가지 부가적인 결정들을 해야 할 필요가 있습니다:


  • 의존성 주입 컨테이너를 위해 MEF 컨테이너를 사용할지 Unity 컨테이너를 사용할지, 아니면 다른 컨테이너를 사용할지 결정해야 할 것입니다. 이는 당신이 사용해야만 할 부트스트래퍼 클래서가 무엇인지를 결정하게 할 것이고, 다른 컨테이너를 위한 부프트스트래퍼를 생성할 필요가 있는지 여부를 결정하게 할 것입니다.
  • 응용프로그램에서 사용하기 원하는 특별한 서비스들이 있는지 생각해 봐야 합니다. 그 서비스들은 컨테이너에 등록될 필요가 있습니다.
  • 어떤 빌트인 로깅 서비스가 당신의 필요에 맞는지, 혹은 다른 로깅 서비스를 생성해야할 필요가 있는지 결정해야 합니다.
  • 응용프로그램이 모듀들을 어떻게 발견할지를 결정해야 합니다: 명시적인 코드 선언들을 통해서, 디렉토리 스캐닝을 통해 발견된 모듈들 상의 코드 애트리뷰트들을 통해서, configuration 을 통해서, XAML 을 통해서.
나머지 챕터들은 좀 더 세부적인 내용을 제공합니다.

코드 시나리오들



스타트업 시퀀스를 생성하는 것은 프리즘 응용프로그램을 빌드하는 매우 중요한 과정입니다. 이 섹션은 부트스트래퍼를 생성하는 방법과, 쉘을 생성하고 의존성 주입 컨테이너를 구성하고 응용프로그램 수준 서비스들을 등록하기 위해서 부트스트래퍼를 커스터마이즈하는 방법에 대해서 설명합니다. 그리고 모듈들을 로드하고 초기화하는 방법에 대해 설명합니다.


응용프로그램을 위해서 부트스트래퍼 생성하기



의존성 주입 컨테이너로서 Unity 나 MEF 를 선택했다면, 응용프로그램을 위한 간단한 부트스트래퍼를 생성하는 것은 쉽습니다. MefBootstrapperUnityBootstrapper 를 상속하는 새로운 클래스를 생성하기만 하면 될 것입니다. 그리고 CreateShell 메서드를 구현합니다. 추가적으로 InitializeShell 메서드를 특별한 쉘 초기화를 위해 재정의할 수도 있습니다.


CreateShell 메서드 구현하기



CreateShell 메서드는 개발자가 프리즘 응용프로그램을 위한 최상위 수준 윈도우를 지정할 수 있도록 허용합니다. 그 쉘은 보통 MainWindow 이거나 MainPage 입니다. 이 메서드를 응용프로그램의 쉘 클래스들 중의 인스턴스 중 하나를 반환하도록 구현하십시오. 프리즘 응용프로그램에서, 당신은 쉘 오브젝트를 생성하거나 그것을 컨테이너로부터 가지고 올 수 있습니다. 이는 응용프로그램의 요구사항에 의존합니다.


ServiceLocator 를 사용해서 쉘 오브젝트를 가지고 오는 예제가 아래 코드 예제에서 보여집니다.



노트 :


당신은 종종 특정 의존성 주입 컨테이너 대신에 ServiceLocator 가 타입들의 인스턴스들을 가지고 오기 위해서 사용되는 것을 보게 될 것입니다. ServiceLocator 는 컨테이너를 호출함으로써 구현되므로, 컨테이너 불가지론적 코드를 위해서는 그것이 좋은 선택입니다. 당신은 ServiceLocator 대신에 컨테이너를 직접적으로 참조하고 사용할 수도 있습니다.


InitializeShell 메서드 구현하기



쉘을 생성했다면, 쉘이 디스플레이될 준비가 되었는지를 명확하게 하기 위한 초기화 단계를 수행할 필요가 있습니다. 당신이 WPF 를 작성하느냐 실버라이트를 작성하느냐에 따라, InitializeShell 메서드 구현은 다양해질 것입니다. 실버라이트 응용프로그램을 위해서, 당신은 아래에 보이는 것처럼, 응용프로그램의 visual root 로서 쉘을 설정할 수 것입니다.



WPF 응용프로그램을 위해서, 당신은 아래에 보이는 것처럼, 쉘 응용프로그램 오브젝트를 생성하고, 그것을 응용프로그래의 메인 윈도우로서 설정할 것입니다( WPF 를 위한 모듈성 퀵스타트의 코드 중 일부 ).



IniializeShell 의 기저 구현은 아무것도 수행하지 않습니다. 기저 클래스 구현을 호출하지 않는 것이 안전합니다.


모듈 카탈로그를 생성하고 구성하기



모듈 응용프로그램을 빌드하고 있다면, 모듈 카탈로그를 생성하고 빌드할 필요가 있을 것입니다. 프리즘은 견고한 IModuleCatalog 인스턴스를 사용해, 응용프로그램에 대해 이용 가능한 모듈들이 무엇인지, 어떤 모듈들이 다운로드될 수 있는지, 어디에 모듈들이 위치하는지에 대한 트랙을 유지합니다.


Bootstrapper 는 카탈로그와 CreateModuleCatalog 가상 메서드에 대한 기저 구현을 참조하기 위해 보호된 ModuleCatalog 속성을 제공합니다. 기저 구현은 새로운 ModuleCatalog 를 반환합니다; 그러나 이 메서드는, 실버라이트를 위한 MEF 를 사용한 모듈성 퀵스타트의 QuickStartBootstrapper 로부터의 코드에서 볼 수 있듯이, 다른 IModuleCatalog 인스턴스를 제공하기 위해서 재정의될 수 있습니다. 



UnityBootstrapperMefBootstrapper 클래스들에서, Run 메서드는 CreateModuleCatalog 메서드를 호출하며, 클래스들의 ModuleCatalog 속성은 그 반환값을 사용해서 설정됩니다. 만약 이 메서드를 재정의하면, 기저 클래스의 기저 구현을 호출할 필요가 없습니다. 왜냐하면 당신은 제공되는 기능을 대체할 것이기 때문이다. 모듈성에 대한 더 많은 정보를 원한다면, 도움말의 "Modular Application Development" 를 참조하십시오.


컨테이너를 생성하고 구성하기



컨테이너들은 프리즘 라이브러리를 사용해서 생성된 응용프로그램에서 핵심적인 역할을 수행합니다. 컨테이너의 최상위에서 빌드된 프라즘 라이브러리와 응용프로그램은 요청된 종속성들과 서비스들을 주입inject하기 위해서 컨테이너에 의존합니다. 컨테이너 구성 단계 동안에, 몇몇 코어 서비스들이 등록됩니다. In addition to these core services, you may have application-specific services that provide additional functionality as it relates to composition.


코어 서비스들



다음 표는 프리즘 라이브러리 내의 core non-application specific service 들을 열거합니다.



 서비스 인터페이스

설명 

 IModuleManager

 응용프로그램의 모듈들을 획득하고 초기화할 서비스들에 대한 인터페이스들을 정의합니다.

 IModuleCatalog

 응용프로그램 내의 모듈들에 대한 메타데이터를 포함합니다. 프리즘 라이브러리는 몇 가지 다양한 카탈로그들을 제공합니다.

 IModuleInitializer

 모듈들을 초기화합니다.

 IRegionManager

 영역들을 등록하고 획득하는데, 영역들은 레이아웃을 위한 비쥬얼 컨테이너들입니다.

 IEventAggregator

 발행자와 구독자 사이에 느슨하게 연결된 이벤트들의 집합입니다.

 ILoggerFacade

 로깅 메커니즘을 위한 래퍼입니다. 자신만의 로깅 메커니즘을 선택할 수 있습니다. Stock Trader Reference Implementation( Staock Trader RI ) 은 EnterpriseLibraryLoggerAdapter 클래스를 통해서 엔터프라이즈 라이브러리 로깅 응용프로그램 블락을 사용하는데, 해당 응용프로그램은 자신만의 로거를 사용하는 방법에 대한 예제로 제공됩니다. 로깅 서비스는 부트스트래퍼의 Run 메서드에 의해 컨테이너에 등록되는데, CreateLogger 메서드의 반환값을 사용합니다. 컨테이너에 또 다른 로거를 등록하는 것은 불가능합니다; 대신에 부트스트래퍼의 CreateLogger 메서드를 재정의하십시오.

 IServiceLocator

 프리즘 라이브러리가 컨테이너에 접근할 수 있도록 합니다. 만약 라이브러리를 커스터마이즈하거나 확장하려고 한다면, 이것이 유용할 것입니다.


응용프로그램 특정 서비스들



다음 표는 응용프로그램 틍정 서비스들을 열거하는데, 그것들은 Stock Trader RI 에서 사용된 것들입니다. 이는 응용프로그램이 제공할 수 있는 서비스들의 유형을 이해하는 예제로서 사용될 수 있습니다.



 Stock Traader RI 의 서비스들

 설명

 IMarketFeedService

 실시간 ( 가상의 ) 마킷 데이터를 제공합니다. PositionSummaryPresentationModel 은 이 서비스로부터 획득한 통지에 기반한 position screen 을 갱신합니다.

 IMarketHistoryService

 선택된 펀드에 대한 트렌드 라인을 디스플레이하기 위해서 사용되는 히스토리컬 마킷 데이터를 제공합니다.

 IAccountPositionService

 포트폴리오에 있는 펀드들의 리스트를 제공합니다.

 IOrderService

 제출된 판매/구입 주문들을 넣습니다.

 INewsFeedService

 선택된 펀드에 대한 뉴스 아이템들의 리스트를 제공합니다.

 IWatchListService

 새로운 관심 아이템들이 관심 리스트에 추가될 때를 다룹니다.


두 종류의 Bootstrapper 를 상속한 클래스들이 프리즘에서 이용가능한데, 그것들은 UnityBootstrapperMefBootstrapper 입니다. 서로 다른 컨테이너들을 생성하고 구성하는 것은 서로 다르게 구현된 비슷한 개념들을 포함합니다.


UnityBootstrapper 에서 컨테이너를 생성하고 구성하기



UnityBootstrapper 클래스의 CreateContainer 메서드는 단순하게 UnityContainer 를 생성하고 그것의 인스턴스를 반환합니다. 대부분의 경우에, 이 동작을 변경할 필요는 없을 것입니다; 그러나 이 메서드는 가상 메서드이며, 그러므로 유연성을 가지고 있습니다.


컨테이너가 생성되면, 아마도 응용프로그램을 위해 구성될 필요가 있습니다. UnityBootstrapper 에서 ConfigureContainer 구현은 기본적으로 몇 개의 코어 프리즘 서비스들을 다음과 같이 등록합니다.


노트 :


이 예제는 모듈이 자신의 Initialize 메서드 내에서 모듈 수준 서비스들을 등록할 때의 것입니다.




부트스트래퍼의 RegisterTypeIfMissing 메서드는 서비스가 이미 등록되었는지 여부를 판단합니다 - 그것은 두 번 등록하지 않도록 할 것입니다. 이는 구성을 통해서 당신이 기본 등록을 재정의할 수 있도록 허용합니다. 또한 기본값으로 어떤 서비스들의 등록을 해제할 수도 있습니다; 이를 위해서는, 중복정의된 Bootstrapper.Run 메서드에 false 를 넘겨서 사용하십시오. 또한 ConfigureContainer 메서드를 재정의해서 이벤트 어그리게이터와 같은 원하지 않는 서비스들을 비활성화할 수도 있습니다.


노트 :


만약 기본 등록을 해제하고 싶다면, 수동적으로 요청된 서비스들을 등록해줄 필요가 있습니다.


ConfigureContainer 의 기본 동작을 확장하려면, 단순하게 당신의 응용프로그램의 부트스트래퍼에 재정의를 추가하고, 선택적으로 기저 구현을 호출합니다. 이는 ( Unity 를 사용하는 ) WPF 를 위한 모듈성 퀵스타트로부터 가져온 QuickStartBootstraper 의 코드에 나와 있습니다. 이 구현은 기저 클래스의 구현을 호출하며, IModuleTracker 의 완전한 구현인 ModuleTracker 타입을 등록합니다. 그리고 Unity 를 사용하는 CallbackLogger 의 싱글톤 인스턴스로서 callbackLogger 를 등록합니다.



MefBootstrapper 에서 컨테이너 생성하고 구성하기



MefBootstrapper 클래스의 CreateContainer 메서드는 몇 가지 일을 수행합니다. 먼저 그것은 AssemblyCatalog CatalogExportProvider 를 생성합니다. CatalogExportProvider MefExtension 어셈블리가 여러 프리즘 타입들에 대한 기본 익스포트를 수행할 수 있도록 해 주며, 여전히 당신으로 하여금 기본 타입 등록을 재정의할 수 있게 해 줍니다. CreateContainer CatalogExportProvider 를 사용해서 CompositionContainer 의 새로운 인스턴스를 생성하고 반환합니다. 대부분의 경우에, 이 동작을 변경할 필요는 없습니다; 그러나 이 메서드는 가상 메서드이고, 그러므로 유연성을 허용합니다.


노트 :


실버라이트에서는, 보안 제약때문에, 타입을 사용해서 어셈블리를 획득하는 것이 불가능합니다. 대신에 프리즘은 Assembly.GetCllingAssembly 메서드를 사용하는 다른 메서드를 사용합니다.


컨테이너가 생성되면, 응용프로그램을 위해 구성될 필요가 있습니다. MefBootstrapper 의 ConfigureContainer 구현은 다음 예제에 나와 있는 것처럼 기본적으로 몇 개의 코어 프리즘 서비스들을 등록합니다.만약 이 메서드를 재정의한다면, 코어 프리즘 서비스들을 등록하기 위해서 기저 클래스의 구현을 호출해야 할 것인지, 당신의 구현에 이 서비스들을 제공할 것인지 주의깊게 결정해야 합니다.



노트 :


MefBootstrapper 에서, 프리즘 코어 서비스들은 싱글톤으로 컨테이너에 추가되므로, 그것들은 응용프로그램 전체에서 컨테이를 통해서 찾을 수 있습니다.


CreateContainer 메서드와 ConfigureContainer 메서드를 제공하는 것과 더불어, MefBootstrapper 는MEF 에 의해 사용되는 AggregateCatalog 를 생성하고 구성하는 두 개의 메서드들도 제공합니다. CreateAggregateCatalog 메서드는 단순히 AggregateCatalog 오브젝트를 생성하고 반환하기만 합니다. MefBootstrapper 의 다른 메서드들과 마찬가지로, CreateAggregateCatalog 는 가상 메서드이며, 필요할 때 재정의될 수 있습니다.


ConfigureAggregateCatalog 메서드는 부득이한 경우에 AggregateCatalog 에 타입 등록을 추가할 수 있도록 허용합니다. 예를 들어 실버라이트를 위한 MEF 를 사용하는 모듈성 퀵스트타의 QuickStartBootstrapper 는 명시적으로 ModuleA ModuleC AggregateCatalog 에 다음과 같이 추가합니다.



더 많은 정보



MEF, AggregateCatalog, AssemblyCatalog 에 대한 더 많은 정보를 원한다면, MSDN 의 "Managed Extensibility Framework Overview" 를 참조하십시오 : http://msdn.microsoft.com/en-us/library/dd460648.aspx


'Programming > Prism4.1' 카테고리의 다른 글

진보된 MVVM 시나리오들  (0) 2014.09.20
MVVM 패턴 구현하기  (0) 2014.09.16
모듈러 응용프로그램 개발  (0) 2014.09.13
컴포넌트 간의 종속성 관리하기  (0) 2014.09.10
왜 프리즘을 사용하는가?  (0) 2014.08.19
소개  (0) 2014.08.18
프리즘 4.1 설치  (0) 2014.08.14

+ Recent posts