004. MS PRISM 정리
Programming/Old 2016. 6. 16. 22:18프리즘 개요
- Prism은 풍부하고, 유연한, 유지보수가 쉬운 WPF 데스크톱 프로그램을 쉽게 디자인하고 개발 가능 할 수 있는 가이드라인 제공
- SoC나 Loose Coupling과 같이 중요한 아키텍처의 디자인 원칙을 포함하는 디자인 패턴 사용
- 독립적이면서 프로그램 간에 쉽고 이음새 없이 통합 가능한 컴포넌트를 설계하고 개발하도록 함
- 다중 스크린을 사용하거나 사용자 인터렉션이 많거나, 중요한 표현 계층 및 비즈니스 로직을 포함한 WPF 프로그램을 개발하는 소프트웨어 개발자를 위해 고안
- 보통 다중 백엔드 시스템이나 서비스, 계층적 아키텍처와 상호작용하는 이러한 어플리케이션들은 여러 계층을 통해 물리적으로 배포 가능
- Reference Implementations와 QuickStarts, 재사용 가능한 라이브러리 코드(the Prism Library), 광범위한 문서가 포함
- Model-View-ViewModel(MVVM) 패턴과 Navigation, Managed Extensibility Framwork(MEF)을 포함한 새 지침을 포함
Composite Application
- monolithic : 컴포넌트들이 매우 밀접하게 결합되어 있고, 각각이 명확히 분리되지 않은 프로그램
- 하나로 집적된(monolithic) 형태로 디자인하고 개발된 어플리케이션은 유지보수하기 매우 어렵고 비효율적
- 새로운 기능을 넣거나, 기존의 기능 대체가 어렵고, 버그 발견 역시 어려움
- 테스트와 배포가 어려움
- 개발자와 디자이너 간 효율적인 작업이 어려움
- 복합 응용 프로그램(Composite Application) : 쉘(shell)형태로 쉽게 통합할 수 있는 약간은 독립적이면서 느슨하게 결합된 여러 개의 컴포넌트로 불리함
- 각각의 모듈은 서러 다른 사람이나 서브 팀이 개별적으로 테스트하고 배포
- 느슨하게 결합된 방법으로 상호작용하는 다양한 모듈들이 제공하는 UI컴포넌트들이 구성된 쉘 사용
- 로깅이나 인증과 같이 응용 프로그램의 수평적 기능, 구체적 비즈니스 기능과 같은 수직적 기능 사이의 관심사 분리가 깔끔하게 이루어짐
- 다른 개발자 혹은 서버 팀들이 특정 과업 혹은 관심이나 전문성에 따른 기능의 분화에 집중할 수 있게 함
모듈
- 기능의 집합으로 독립적으로 개발, 테스트, 배포 가능
- 비즈니스와 관계된 기능으로 표현되며, 기능 구현 위해 모든 View, Service, Data Model을 캡슐화
- 여러 응용 프로그램에서 재사용 가능한 범용 응용 프로그램 기반이나 서비스를 캡슐화 하기도 함
모듈 카탈로그
- 복합 응용 프로그램에서 실행 응용 프로그램은 모듈을 실행 시에 반드시 발견하고 로딩해야 함
- 어떤 모듈을 언제 어떤 순서로 로딩할 것인가를 기술하기 위해 사용
- ModuleManager와 Module Loader 컴포넌트가 원격에 있는 모듈을 다운 받거나 응용 프로그램 도메인에 있는 모듈을 불러오거나 초기화 하기 위해 모듈 카탈로그 사용
- 프로그래밍적인 코드를 사용하거나 선언형태의 XAML 또는 설정 파일을 통한 여러 방법으로 모듈 카탈로그를 구성
쉘
- 모듈이 로드되는 호스트 어플리케이션
- 쉘은 어플리케이션의 전체적인 레이아웃과 구조를 정의하지만, 실행할 모듈에 대해서는 정확히 인지하지 않음
- 범용 어플리케이션 서비스와 인프라를 구현
- 대부분의 어플리케이션의 기능과 콘텐트는 모듈 내부에서 구현됨
- 로드된 모듈에서 제공하는 다른 UI 컴포넌트들이 실행할 최상위의 창과 시각적 요소들을 제공
Bootstrapper
- 여러 프리즘의 구성과 서비스를 초기화하기 위해 어플리케이션에서 사용
- 어플리케이션 수준의 구성과 서비스를 등록하기 위해 DI 컨테이너를 초기화하는데 사용
- 모듈 카탈로그와 쉘의 뷰와 뷰 모델이나 프레젠터를 초기화하고 설정하는 데 사용
View
- 어플리케이션의 특별한 특징이나 함수적 지역에 대한 UI를 캡슐화하는데 UI 컨트롤의 집합
- MVVM 패턴과 결합하는 데 사용
- UI를 캡술화하고, 사용자 인터렉션을 정희하는 데 사용
- 뷰가 근본적인 어플리케이션 기능을 독자적으로 업데이트하고 대체 할 수 있도록 함
- 뷰 모델 클래스와 상호적으로 데이터 바인딩 함
View Model
- 어플리케이션의 프레젠테이션 로직과 상태를 캡슐화하는 클래스 집합
- 많은 어플리케이션의 기능을 캡슐화
- 프로퍼티, 커맨드, 이벤트를 정의
Model
- 어플리케이션의 데이터와 비즈니스 로직을 캡슐화하는 클래스 집합
- 데이터, 유효성 및 일관성과 진실성(integrity)를 보장하는 비즈니스 규칙을 캡슐화
Command
- 어플리케이션의 UI와 독립적으로 정의하고 테스트하기 위한 방식으로 어플리케이션의 기능을 캡슐화함
- 뷰모델에서 커맨드 객체 혹은 함수로 정의
- 프리즘은 DelegateCommand클래스와 CompositeCommand 클래스를 제공
DelegateCommand
- 두 개의 델리게이트를 캡슐화 하는데, 이 델리게이트들은 뷰모델 클래스 내부에 구현된 메소드를 참조
- DelegateCommandBase 상속하며, 이 클래스는 델리게이트들을 호출하여 ICommand 인터페이스의 Execute와 CanExecute메소드를 구현함
- DelegateCommand 클래스 생성자에서 뷰 모델 메소드에 대한 델리게이트들을 구체화함
Composite Command
- 어플리케이션 UI의 부모 뷰의 컨트롤에서 한 개 이상의 뷰모델에 대한 커맨드를 호출하도록 하는 경우
Regions
- 어플리케이션 UI 내부에 정의되어, 뷰가 나타나는 지역적 플레이스홀더
- 어플리케이션 로직에 변화시키지 않고 어플리케이션 UI의 레이아웃을 업데이트하도록 함
- RegionManager 컴포넌트를 통해 다른 컴포넌트들에 의해 위치될 수 있음
RegionContext
- 지역에서 실행되는 부모 뷰와 자식 뷰들과의 콘텍스트를 공유하고자 할 때 유용
- 지역 컨트롤에 나타나는 모든 자식뷰들에게 콘텍스트를 이용할 수 있도록 콘텍스트의 값을 설정함
- 뷰 discovery와 뷰 injection이 가능하도록 함
- WPF의 DataContext는 뷰에 대한 지역 데이터 콘텍스트를 설정하는데 사용되고, 뷰 모델, Local presenter이나 모델과 소통하기 위해 데이터바인딩을 사용하는 반면, RegionContext는 단일이 아닌 복수의 뷰들 간에 콘텍스트를 공유하는데 사용하며, 복수의 뷰들 간 콘텍스트를 공유하기 위해 간단한 메커니즘을 제공함
Navigation
- 사용자들의 상호작용으로 인한 어플리케이션이나 내부 상태 변화로 UI의 변화를 조작하기 위한 프로세스
- UI는 어플리케이션의 visual tree에서 요소들을 더하거나 삭제 혹은 visual tree에 존재하는 요소들의 상태를 변경하여 업데이트 가능
- WPF는 아주 융통성있는 플랫폼이고 이런 접근을 이용하여 특별한 네비게이션 시나리오를 구현가능하지만, 복합 요소들에 대한 어플리케이션에는 이보다 더 적절한 접근법이 있음
- visual tree에 존재하는 컨트롤에 대한 상태 변화로 수행되는 네비게이션은 state-based navigation이라 함
- visual tree에 존재하는 요소들의 추가나 삭제로 수행되는 네비게이션은 view-based navigation이라 함
- 프리즘은 이 두 가지 스타일의 네비게이션 구현을 모두 제공하며, 프레젠테이션 로직과 데이터에서 UI를 구분하기 위해 Model-View-ViewModel(MVVM)을 이용함
EventAggregator
- 멀티캐스트 publish/subscribe 기능을 제공함
- 프리즘 라이브러리에서 만들어지는 이벤트는 typed 이벤트
- 어플리케이션 실행 전에 에러를 감지하는 컴파일 타입 체킹이 가능함
- EVentAggregator는 공급자와 구독자가 구체적인 EventBase를 위치시키도록 함
- Event aggregator는 복수의 공급자들과 구독자들이 사용할 수 있음 (그림 참조)
'Programming > Old' 카테고리의 다른 글
002. Factory Method Pattern (스켈레톤 코드 포함) (1) | 2016.06.24 |
---|---|
002. C++ 전방선언과 인터페이스 사용 방법 (0) | 2016.06.24 |
003. WPF / PlaceHolder, Hint, Watermakr가 적용된 TextBox, PasswordBox (3) | 2016.05.26 |
002. [Github] 충돌, 싱크, 커밋 실패 시 쉘에서 해볼만한 것들 (0) | 2016.05.11 |
001. [Cocos2d-x] 이미지 로드 실패로 인한 버튼 미생성 (0) | 2016.05.10 |