티스토리 뷰

Record/C#

[C#] Prism 용어 정리

Mizzle 2023. 4. 27. 21:34

C# WPF

C# WPF(Windows Presentation Foundation)는 마이크로소프트에서 개발한 GUI 응용 프로그램 개발을 위한 플랫폼입니다. WPF는 XAML(Extensible Application Markup Language)을 사용하여 사용자 인터페이스를 설계하고, C# 또는 다른 .NET 언어를 사용하여 비즈니스 로직을 작성할 수 있습니다.

WPF는 다음과 같은 특징을 가지고 있습니다.

  • 분리된 UI와 비즈니스 로직: WPF는 비즈니스 로직과 UI를 분리하여 개발할 수 있습니다. 이를 통해 코드의 가독성과 재사용성을 높일 수 있습니다.
  • 스타일링: WPF는 스타일과 템플릿을 사용하여 UI를 꾸밀 수 있습니다. 이를 통해 코드의 중복을 줄이고, 일관성 있는 UI를 만들 수 있습니다.
  • 데이터 바인딩: WPF는 데이터 바인딩을 지원하여 UI와 비즈니스 로직을 쉽게 연결할 수 있습니다. 이를 통해 UI를 업데이트하는 코드를 작성할 필요 없이 데이터 모델의 변경에 따라 UI가 자동으로 업데이트됩니다.
  • 애니메이션: WPF는 애니메이션을 지원하여 UI를 부드럽게 처리할 수 있습니다. 이를 통해 사용자 경험을 향상시킬 수 있습니다.

WPF는 데스크톱 응용 프로그램 개발을 위한 플랫폼이며, 윈도우에서 실행됩니다. 따라서 .NET Framework가 설치된 윈도우 환경에서 개발 및 실행됩니다. 최근에는 .NET Core를 기반으로 한 크로스 플랫폼 개발도 가능합니다.

C# Prism

C# Prism은 마이크로소프트의 WPF(Windows Presentation Foundation) 및 Xamarin.Forms를 위한 MVVM(Model-View-ViewModel) 애플리케이션 개발을 위한 프레임워크입니다. Prism은 애플리케이션 아키텍처를 구현하고, 애플리케이션 개발에 필요한 다양한 기능들을 제공합니다.

Prism은 다음과 같은 기능을 제공합니다.

  • 모듈화: 애플리케이션을 모듈화하여 유지보수와 확장성을 향상시킵니다.
  • DI(Dependency Injection): DI를 사용하여 클래스 간의 의존성을 관리합니다.
  • 이벤트 집약기(Event Aggregator): 이벤트를 게시하고 구독하며, 클래스 간의 느슨한 결합을 유지합니다.
  • 명령(Command): ICommand 인터페이스를 구현하여 명령을 관리합니다.
  • 상태 저장 및 복원: 애플리케이션 상태를 저장하고 복원합니다.
  • 지역화(Localization): 지역화된 리소스를 사용하여 애플리케이션을 다국어 지원합니다.
  • 네비게이션(Navigation): URI 기반의 네비게이션을 제공합니다.
  • 테스트 가능성(Testability): 테스트 가능한 애플리케이션을 만들 수 있습니다.

Prism은 WPF와 Xamarin.Forms를 지원하며, 이를 통해 다양한 플랫폼에서 애플리케이션을 개발할 수 있습니다. 또한, Prism은 오픈 소스 프로젝트로, GitHub에서 코드를 다운로드하고 컨트리뷰션을 할 수 있습니다.

C# DevExpress

C# DevExpress는 C# 개발자가 사용할 수 있는 UI 컴포넌트 및 애플리케이션 프레임워크입니다. DevExpress는 .NET 프레임워크를 기반으로 하며, WinForms, WPF, ASP.NET, Xamarin 등 다양한 플랫폼에서 사용할 수 있습니다.

DevExpress는 다음과 같은 기능을 제공합니다.

  • UI 컴포넌트: DevExpress는 다양한 UI 컴포넌트를 제공하여 사용자 인터페이스를 쉽게 구현할 수 있습니다. 그리드, 차트, 스케줄러, 리치 에디터 등 다양한 컴포넌트가 제공됩니다.
  • 애플리케이션 프레임워크: DevExpress는 애플리케이션 개발에 필요한 다양한 기능을 제공합니다. 보고서, 메시지 박스, 데이터 바인딩, 검색 등의 기능을 지원합니다.
  • 디자인 도구: DevExpress는 UI 디자인 도구를 제공합니다. 이를 통해 UI를 쉽게 디자인하고, 미리보기 기능을 제공하여 디자인 결과를 빠르게 확인할 수 있습니다.
  • 데이터 시각화: DevExpress는 데이터 시각화 기능을 제공합니다. 차트, 맵, 게이지 등 다양한 시각화 도구를 제공하여 데이터를 쉽게 이해할 수 있도록 도와줍니다.
  • 보안: DevExpress는 보안 기능을 제공합니다. 인증, 권한 부여, 데이터 보호 등의 기능을 제공하여 애플리케이션 보안을 강화할 수 있습니다.

DevExpress는 상용 라이브러리로서 유료로 제공되며, 라이선스에 따라 다양한 기능을 사용할 수 있습니다. 또한, 무료 평가판을 제공하며, 개인용 라이선스도 제공합니다.

Theory

DI(Dependency Injection)

  • 객체 간의 의존성을 처리하는 패턴 중 하나입니다.
  • Prism에서는 IoC 컨테이너를 사용하여 DI를 구현합니다.
  • 객체 생성 및 의존성 주입을 컨테이너에게 맡김으로써, 코드의 결합도를 낮출 수 있습니다.
  • DI를 사용하면 유지 보수성이 향상되며, 테스트 용이성도 높아집니다.

DP(Dependency Property)

  • WPF(Windows Presentation Foundation)에서 사용하는 개념입니다.
  • UI 요소의 속성(Property) 값을 XAML 등의 외부에서 설정할 수 있도록 하는 기능입니다.
  • DP를 사용하면, 템플릿을 사용하는 컨트롤에서도 속성 값을 설정할 수 있습니다.
  • Prism에서는 DP를 사용하여 뷰와 뷰모델 간의 데이터 바인딩을 처리합니다.
  • DP를 사용하면, 뷰와 뷰모델 간의 결합도를 낮출 수 있습니다.

Prism

Prism

Prism는 항상 의존성 주입을 기반으로 구축되었습니다. 이를 통해 유지 관리 가능하고 테스트 가능한 앱을 설계하고 정적 및 순환 참조에 대한 의존성을 줄이거나 제거하는 데 도움이됩니다. Prism 7 이전에는 Prism과 함께 사용하기 위해 구현 된 다양한 컨테이너를 중심으로 의존성 주입이 집중되었습니다. 이는 문서에서 하나의 컨테이너를 사용하여 작업을 수행하는 방법을 보여주는 경우가 있었지만, 응용 프로그램에 사용하는 컨테이너에 대한 적절한 API를 반영하지 않았다는 문제를 일으켰습니다.

Prism 7에서는 의존성 주입에 필요한 것을 추상화하기 위해 여러 개의 새로운 인터페이스가 소개되었습니다. 이에는 다음과 같은 여러 가지 이점이 있습니다.

  • Prism에서 어떤 작업을 수행하는 방법을 보여주는 문서는 사용하는 의존성 주입 컨테이너에 대한 걱정 없이 항상 필요한 작업을 보여줍니다.
  • 이는 어떤 컨테이너 특정 패키지에 추가해야하는 것을 크게 단순화시켰습니다. Prism.Forms의 경우, 각 컨테이너 특정 프로젝트가 3개의 클래스를 줄일 수 있습니다: PrismApplication, IContainerExtension의 구현체 및 Prism에서 구현되지 않은 API 중 하나에 액세스해야하는 경우 기본 컨테이너를 검색하기위한 확장 클래스입니다.

Prism View

C# Prism에서 View는 사용자 인터페이스의 시각적인 요소를 나타내는 클래스입니다. View는 XAML 파일과 코드 비하인드(C# 또는 VB.NET 코드)로 작성될 수 있으며, 사용자 인터페이스를 구성하는 컨트롤과 레이아웃, 스타일 등을 포함합니다.

Prism에서 View는 일반적으로 ViewModel과 연결되어 ViewModel에서 데이터를 바인딩하고 이벤트를 처리합니다. View와 ViewModel 간의 연결은 일반적으로 ViewModelLocator 클래스를 사용하여 수행됩니다. ViewModelLocator는 View와 ViewModel을 매핑하며, View의 DataContext를 해당 ViewModel 인스턴스로 설정합니다.

View는 일반적으로 다음과 같은 특징을 가지고 있습니다.

  • XAML로 작성됩니다.
  • 하나 이상의 UI 컨트롤을 포함합니다.
  • ViewModel과 연결됩니다.
  • DataContext를 사용하여 ViewModel과 바인딩합니다.

Prism에서 View는 다양한 기능을 수행할 수 있습니다. 예를 들어, View는 다른 View 또는 모듈과 상호 작용할 수 있으며, 이를 통해 애플리케이션의 다양한 부분 간에 데이터를 전달할 수 있습니다. 또한, View는 다른 View 또는 모듈에서 발생한 이벤트를 처리하고, 이를 통해 애플리케이션의 다양한 부분 간에 메시지를 전달할 수 있습니다.

Prism Binding

C#에서 프리즘을 사용하여 바인딩이란 뷰의 속성(예: 컨트롤 또는 레이아웃 요소)을 뷰 모델의 속성과 연결하는 과정을 말합니다. 이를 통해 뷰는 데이터를 표시하고 뷰 모델에서 변경 사항이 있을 때 업데이트합니다.

프리즘은 데이터 바인딩을 수행하는 여러 가지 방법을 제공합니다.

  1. 프로퍼티 주입: 이 방법은 뷰 모델을 뷰의 종속성으로 주입하고 뷰의 DataContext 속성을 뷰 모델로 설정하는 것입니다. 이를 통해 뷰 모델의 속성을 뷰의 속성과 바인딩할 수 있습니다.
  2. 바인딩 마크업 확장: 이것은 XAML 기반의 데이터 바인딩 방법으로, 마크업 확장을 사용하여 속성의 바인딩 경로를 설정합니다. 이를 통해 바인딩 프로세스를 더 세분화할 수 있습니다.
  3. 이벤트 집합: 이것은 뷰와 뷰 모델 사이에서 데이터를 전송할 때 이벤트를 사용하는 메시징 기반 데이터 바인딩 방법입니다. 여러 개의 뷰와 뷰 모델 간에 데이터를 전송해야 하는 경우 유용합니다.

다음은 뷰의 속성을 뷰 모델의 속성과 바인딩하는 방법을 프로퍼티 주입을 사용하여 보여주는 예시입니다.

  1. 바인딩할 속성이 있는 뷰 모델 클래스를 만듭니다.
  2. public class MyViewModel { public string MyProperty { get; set; } }
  3. 바인딩할 속성이 있는 뷰 클래스를 만듭니다.
  4. public partial class MyView : UserControl { public MyView(MyViewModel viewModel) { InitializeComponent(); DataContext = viewModel; } }
  5. 뷰의 XAML 마크업에서 속성의 바인딩 경로를 뷰 모델의 속성으로 설정합니다.]
  6. <TextBox Text="{Binding MyProperty}" />

이 예제에서 TextBox 컨트롤은 뷰 모델의 MyProperty 속성과 바인딩됩니다. MyProperty의 값이 변경되면 TextBox의 값도 그에 따라 업데이트됩니다.

Prism ViewModel

C# Prism에서 ViewModel은 View와 Model 간의 중간 계층으로 사용됩니다. ViewModel은 Model에서 데이터를 가져와 View에 표시할 수 있는 형식으로 가공하며, View에서 사용자가 수행한 작업을 Model에 전달합니다.

ViewModel은 보통 View와 1:1로 매핑되며, ViewModel은 View의 DataContext로 설정됩니다. 이렇게 하면 View에서 ViewModel의 속성과 메서드에 바인딩할 수 있으며, View에서 발생하는 이벤트를 ViewModel에서 처리할 수 있습니다.

Prism에서 ViewModel은 BindableBase 클래스를 상속받아 작성됩니다. BindableBase 클래스는 INotifyPropertyChanged 인터페이스를 구현하여 ViewModel에서 속성 변경 알림을 제공합니다. 이를 통해 View에서 ViewModel의 속성에 바인딩된 컨트롤은 ViewModel의 속성 값이 변경될 때마다 자동으로 업데이트됩니다.

ViewModel은 다음과 같은 특징을 가지고 있습니다.

  • Model에서 데이터를 가져와 가공합니다.
  • View와 바인딩됩니다.
  • BindableBase 클래스를 상속받아 작성됩니다.
  • View에서 발생하는 이벤트를 처리합니다.
  • INotifyPropertyChanged 인터페이스를 구현하여 속성 변경 알림을 제공합니다.

Prism에서 ViewModel은 다양한 기능을 수행할 수 있습니다. 예를 들어, ViewModel은 View에서 발생하는 이벤트를 처리하고, 이를 통해 View에서 Model로 데이터를 전달할 수 있습니다. 또한, ViewModel은 다른 ViewModel과 상호 작용할 수 있으며, 이를 통해 애플리케이션의 다양한 부분 간에 데이터를 전달할 수 있습니다.

Prism Model

C# Prism에서 Model은 데이터를 저장하고 처리하는 계층입니다. Model은 보통 데이터베이스, 파일 또는 웹 서비스 등과 같은 데이터 소스와 상호 작용하여 데이터를 검색, 저장, 업데이트 및 삭제합니다.

Model은 비즈니스 로직과 데이터에 대한 모든 작업을 담당합니다. ViewModel은 Model에서 데이터를 가져와 가공하며, View는 ViewModel을 통해 데이터를 표시합니다. 이렇게 하면 View와 Model 간의 결합도를 줄일 수 있습니다.

Prism에서 Model은 다음과 같은 특징을 가지고 있습니다.

  • 데이터를 저장하고 처리합니다.
  • 데이터 소스와 상호 작용합니다.
  • 비즈니스 로직을 처리합니다.

Model은 다양한 데이터 소스와 상호 작용할 수 있습니다. 예를 들어, Model은 데이터베이스와 연결하여 데이터를 가져오거나 저장할 수 있습니다. 또한, Model은 파일 또는 웹 서비스와 상호 작용하여 데이터를 가져오거나 저장할 수 있습니다.

Prism에서 Model은 간단한 클래스로 구성될 수 있습니다. 클래스는 데이터 속성 및 데이터 소스와 상호 작용하는 메서드를 포함할 수 있습니다. 이 클래스는 ViewModel에서 인스턴스화되어 사용됩니다.

Prism Property

C# Prism에서 Property는 일반적으로 뷰(View)와 뷰모델(ViewModel) 간의 데이터 바인딩을 처리하는 데 사용됩니다.

Prism에서는 WPF(Windows Presentation Foundation)의 종속 속성(Dependency Properties)을 기반으로 하는 Prism의 종속 속성(Dependency Property)을 제공합니다. Prism의 종속 속성은 기본적으로 WPF의 종속 속성과 유사한 기능을 제공합니다.

Prism의 종속 속성을 사용하면, 뷰와 뷰모델 간의 데이터 바인딩을 보다 쉽게 처리할 수 있습니다. 뷰모델에서 값이 변경되면, Prism의 종속 속성이 자동으로 업데이트되며, 이에 따라 뷰의 표시도 자동으로 변경됩니다.

또한, Prism의 종속 속성은 다음과 같은 기능을 제공합니다.

  • 속성 값 변경 이벤트: 속성 값이 변경될 때 이벤트를 발생시킵니다.
  • 속성 값 유효성 검사: 속성 값이 유효한지 검사합니다.
  • 기본값 설정: 속성 값이 지정되지 않은 경우 기본값을 설정합니다.

Prism의 종속 속성을 사용하면, 뷰와 뷰모델 간의 결합도를 낮출 수 있습니다. 이를 통해 코드의 가독성과 유지 보수성이 향상됩니다.

Prism IoC

C# Prism은 IoC(Inversion of Control) 컨테이너를 제공합니다. Prism의 IoC 컨테이너는 빠르고 유연하며, 객체 생성 및 의존성 주입을 처리할 수 있습니다. Prism의 IoC 컨테이너는 MEF(Managed Extensibility Framework) 및 Unity 컨테이너를 사용합니다.

Prism의 IoC 컨테이너를 사용하면, 객체 생성 및 의존성 주입을 손쉽게 처리할 수 있습니다. 개발자는 객체 생성 및 의존성 주입 코드를 작성하지 않아도 됩니다. 대신, Prism의 IoC 컨테이너에 객체 생성 및 의존성 주입을 위한 설정을 등록하면, Prism의 IoC 컨테이너가 객체 생성 및 의존성 주입을 처리해줍니다.

Prism의 IoC 컨테이너는 다음과 같은 기능을 제공합니다.

  • 객체 생성: 개발자가 요청한 객체를 생성합니다.
  • 의존성 주입: 객체를 생성하면서 객체가 의존하는 다른 객체를 주입합니다.
  • 서비스 등록: 객체 생성 및 의존성 주입을 위한 설정을 등록합니다.
  • 서비스 검색: 등록된 서비스를 검색합니다.

Prism의 IoC 컨테이너는 MVVM(Model-View-ViewModel) 패턴과 결합하여 사용할 수 있습니다. MVVM 패턴에서는 ViewModel이 View와 Model 사이의 브릿지 역할을 하므로, ViewModel이 의존하는 Model을 Prism의 IoC 컨테이너를 통해 주입할 수 있습니다. 이를 통해 코드의 결합도를 낮출 수 있으며, 유지 보수성을 향상시킬 수 있습니다.

Prism BindableBase

C# Prism에서 BindableBase는 INotifyPropertyChanged 인터페이스를 구현하여 속성 변경 알림을 제공하는 기본 클래스입니다. 즉, BindableBase를 상속받은 클래스에서 속성 값이 변경될 때, PropertyChanged 이벤트를 발생시켜 UI 업데이트를 알리는 기능을 제공합니다.

BindableBase를 사용하면 다음과 같은 장점이 있습니다.

  • 속성 값 변경 알림: 속성 값이 변경될 때 PropertyChanged 이벤트를 발생시켜 UI 업데이트를 수행할 수 있습니다.
  • RaisePropertyChanged 메서드 제공: 속성 값을 변경할 때 RaisePropertyChanged 메서드를 호출하여 속성 변경 알림을 발생시킬 수 있습니다.
  • SetProperty 메서드 제공: 속성 값을 변경할 때 SetProperty 메서드를 사용하여 속성 값이 변경되었는지 여부를 확인하고, 변경되었을 때 속성 변경 알림을 발생시킬 수 있습니다.

BindableBase는 다음과 같이 사용할 수 있습니다.

public class MyViewModel : BindableBase
{
    private string _myProperty;
    public string MyProperty
    {
        get { return _myProperty; }
        set { SetProperty(ref _myProperty, value); }
    }
}

위 예제에서는 MyViewModel 클래스가 BindableBase를 상속받아 속성 변경 알림 기능을 제공하고 있습니다. MyProperty 속성에서는 SetProperty 메서드를 사용하여 속성 값을 변경하고, 이 때 PropertyChanged 이벤트가 자동으로 발생하도록 구현되어 있습니다.

따라서, BindableBase는 Prism에서 속성 변경 알림 기능을 제공하는 기본 클래스로, ViewModel에서 UI 업데이트를 수행할 때 사용됩니다.

Prism TView, TViewModel

C# Prism에서 TView와 TViewModel은 각각 View와 ViewModel의 제네릭 형식 매개변수를 의미합니다.

TView는 해당 ViewModel과 연결될 View의 형식을 지정합니다. 예를 들어, 다음과 같이 TView에 MainView를 지정하면, 해당 ViewModel과 MainView가 연결됩니다.

public class MainViewModel : BindableBase, INavigationAware
{
    public MainViewModel()
    {
        // ...
    }
}

public class MainWindow : Window
{
    public MainWindow(MainViewModel viewModel)
    {
        DataContext = viewModel;
        // ...
    }
}

public class App : PrismApplication
{
    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.RegisterForNavigation<MainView, MainViewModel>();
    }
}

TViewModel은 해당 View와 연결될 ViewModel의 형식을 지정합니다. 예를 들어, 위 예제에서는 TViewModel에 MainViewModel을 지정하여 MainView와 MainViewModel이 연결됩니다.

ViewModel과 View가 제대로 연결되면, Prism은 ViewModel을 View의 DataContext로 설정하여 ViewModel에서 노출할 속성과 명령을 View에서 사용할 수 있도록 합니다. 이렇게 View와 ViewModel이 연결되면, MVVM 디자인 패턴에 따라 View와 ViewModel의 역할을 분리할 수 있습니다.

Prism ICommand

C# Prism에서 ICommand는 MVVM(Model-View-ViewModel) 패턴에서 사용되는 인터페이스로, View에서 발생한 이벤트를 ViewModel에서 처리하기 위한 목적으로 사용됩니다. ICommand 인터페이스는 Execute()와 CanExecute() 메서드를 정의하고 있습니다.

  • Execute(): 이벤트가 발생했을 때 실행되는 메서드입니다.
  • CanExecute(): 이벤트가 실행 가능한지 여부를 반환하는 메서드입니다.

ICommand를 구현하여 ViewModel에서 명령을 처리하는 것은 이벤트 처리보다 더욱 유연하고 강력한 방법입니다. ICommand를 구현하여 View와 ViewModel 간의 결합도를 줄이면서 이벤트 처리를 처리할 수 있습니다.

Prism은 ICommand를 구현하는 여러 클래스를 제공합니다. 가장 기본적인 클래스로는 DelegateCommand와 RelayCommand가 있습니다.

  • DelegateCommand: ICommand 인터페이스를 구현하는 가장 간단한 방법 중 하나입니다. 일반적으로 람다식 또는 메서드 참조를 사용하여 Execute()와 CanExecute() 메서드를 정의합니다.
  • RelayCommand: ICommand 인터페이스를 구현하는 또 다른 방법입니다. DelegateCommand와 비슷하지만 CanExecute() 메서드를 정의할 때 Predicate 대신 Func을 사용할 수 있습니다.

이외에도 Prism에서는 다양한 ICommand 구현체를 제공하며, 이를 사용하여 ViewModel에서 이벤트 처리를 보다 쉽게 구현할 수 있습니다.

Prism TDelegate

C# Prism에서 TDelegate는 Prism의 이벤트 집약기(EventAggregator) 및 명령(Command) 패턴에서 사용되는 제네릭 델리게이트입니다.

델리게이트(delegate)는 메서드를 참조하는 개체로, 메서드의 시그니처(signature)와 일치하는 델리게이트를 만들어 해당 메서드를 호출할 수 있습니다. 제네릭(generic) 델리게이트는 제네릭 형식 매개변수를 사용하여 일반화된 메서드 시그니처를 나타냅니다.

Prism에서는 TDelegate를 사용하여 이벤트를 발행하거나 명령을 실행하는 메서드를 나타냅니다. 이를 통해 이벤트 집약기에서 발행된 이벤트를 처리하거나, 명령을 수행할 때 사용되는 메서드를 나타낼 수 있습니다.

Prism에서는 다음과 같은 제네릭 델리게이트를 제공합니다.

  • Action: 반환값이 없는 메서드를 참조하는 델리게이트입니다.
  • Func: 반환값이 있는 메서드를 참조하는 델리게이트입니다.
  • Predicate: bool 값을 반환하는 메서드를 참조하는 델리게이트입니다.

TDelegate를 사용하여 이벤트나 명령을 처리하는 코드는 일반적으로 ViewModel에서 구현됩니다. 이를 통해 ViewModel은 View와 독립적으로 동작하며, 뷰와의 결합도를 낮출 수 있습니다.

Prism Delegate

Prism은 .NET 기반의 MVVM 패턴 및 의존성 주입 프레임워크입니다. Delegate는 Prism에서 이벤트 기반 통신을 할 때 사용되는 중요한 개념 중 하나입니다.

Delegate는 메서드를 참조하는 개체입니다. 이 개체를 사용하여 메서드를 호출할 수 있습니다. Delegate를 사용하면 이벤트를 다른 객체에서 처리할 수 있습니다.

Prism에서 Delegate는 이벤트를 발생시키는 개체와 이벤트를 처리하는 개체 간의 통신에 사용됩니다. 이를테면, ViewModel에서 발생시킨 이벤트를 View에서 처리할 때 Delegate를 사용합니다.

Delegate는 일반적으로 이벤트 처리기로 사용됩니다. Delegate를 이벤트에 연결하면 이벤트가 발생할 때 Delegate가 호출됩니다. 이를테면, Button이 클릭되었을 때 Delegate가 호출되어 해당 이벤트를 처리할 수 있습니다.

Prism에서 Delegate는 DelegateCommand 클래스를 사용하여 구현됩니다. DelegateCommand 클래스는 ICommand 인터페이스를 구현하며, Delegate를 사용하여 실행할 메서드를 지정합니다. 이를테면, 버튼의 클릭 이벤트를 처리하는 DelegateCommand는 ViewModel에서 정의되며, 해당 DelegateCommand를 View에서 연결하여 버튼 클릭 이벤트를 처리할 수 있습니다.

Prism Container

Prism Container는 Prism 프레임워크에서 제공하는 의존성 주입 컨테이너입니다. 의존성 주입(Dependency Injection)은 객체 간의 의존성을 관리하기 위한 디자인 패턴으로, 객체 생성과 의존성 결합을 컨테이너에서 처리하고 객체 간의 결합도를 낮추는 방식입니다.

Prism Container는 객체의 생성, 등록, 해제를 관리하며, 등록된 객체를 필요로 하는 클래스들은 컨테이너에서 해당 객체를 가져와 사용할 수 있습니다. 이를테면, ViewModel에서 필요로 하는 데이터 서비스를 등록하고, View에서 해당 서비스를 사용할 수 있도록 의존성 주입을 처리할 수 있습니다.

Prism Container는 일반적으로 App.xaml.cs에서 전역으로 사용됩니다. Container를 생성하고 등록하는 코드는 다음과 같습니다.

public partial class App : PrismApplication
{
    private readonly IContainerProvider _containerProvider;

    public App()
    {
        InitializeComponent();

        _containerProvider = CreateContainer();
    }

    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        // 서비스 등록
        containerRegistry.RegisterSingleton<IMyService, MyService>();
    }

    protected override Window CreateShell()
    {
        return Container.Resolve<MainWindow>();
    }

    private IContainerProvider CreateContainer()
    {
        var builder = new ContainerBuilder();

        builder.RegisterType<MainWindowViewModel>();

        return new AutofacContainerExtension(builder.Build());
    }
}

위 코드에서 RegisterTypes메서드에서 서비스를 등록하고, CreateShell 메서드에서 MainWindow를 생성하며, Container에서 MainWindowViewModel을 등록합니다. 이후 View에서 해당 ViewModel을 필요로 할 때 Container에서 해당 ViewModel을 가져와 사용할 수 있습니다.

Prism IContainerRegistry

C# Prism에서 IContainerRegistry는 Prism 컨테이너에 등록하는 인터페이스입니다. Prism 컨테이너는 의존성 주입(Dependency Injection)을 사용하여 클래스 간의 의존 관계를 관리하는 기능을 제공합니다. 이때 IContainerRegistry 인터페이스는 이러한 의존성 관리 기능을 보다 쉽게 사용할 수 있도록 합니다.

IContainerRegistry은 다음과 같은 기능을 제공합니다.

  1. Register 메서드: 컨테이너에 클래스를 등록합니다.
  2. RegisterInstance 메서드: 컨테이너에 인스턴스를 등록합니다.
  3. RegisterSingleton 메서드: 컨테이너에 싱글톤 인스턴스를 등록합니다.
  4. RegisterMany 메서드: 컨테이너에 여러 클래스를 등록합니다.
  5. RegisterManySingletons 메서드: 컨테이너에 여러 싱글톤 인스턴스를 등록합니다.
  6. RegisterScoped 메서드: 컨테이너에 스코프 인스턴스를 등록합니다.
  7. RegisterScopedMany 메서드: 컨테이너에 여러 스코프 인스턴스를 등록합니다.
  8. RegisterForNavigation 메서드: Prism 내비게이션을 위해 뷰와 뷰 모델을 등록합니다.
  9. HasRegistration 메서드: 컨테이너에서 지정한 형식이 등록되어 있는지 여부를 확인합니다.

IContainerRegistry은 다음과 같이 사용할 수 있습니다.

public class MyModule : IModule
{
    private readonly IContainerRegistry _container;

    public MyModule(IContainerRegistry container)
    {
        _container = container;
    }

    public void RegisterTypes(IContainerRegistry containerRegistry)
    {
        // MyService 클래스를 싱글톤으로 등록합니다.
        _container.RegisterSingleton<MyService>();
    }
}

위 예제에서는 MyModule 클래스에서 IContainerRegistry를 주입받아 RegisterTypes 메서드에서 MyService 클래스를 싱글톤으로 등록하고 있습니다. 이렇게 하면 의존성 관리 기능을 사용하여 클래스 간의 의존 관계를 관리할 수 있으며, IContainerRegistry을 사용하여 Prism 컨테이너의 기능을 보다 쉽게 사용할 수 있습니다.

Prism IContainerProvider

C# Prism에서 IContainerProvider는 Prism 컨테이너의 기본 인터페이스입니다. Prism 컨테이너는 의존성 주입(Dependency Injection)을 사용하여 클래스 간의 의존 관계를 관리하는 기능을 제공합니다. 이때 IContainerProvider 인터페이스는 이러한 의존성 관리 기능을 사용하는 클래스에서 컨테이너를 사용할 수 있도록 합니다.

IContainerProvider는 다음과 같은 기능을 제공합니다.

  1. Resolve 메서드: 컨테이너에서 지정한 형식의 인스턴스를 검색합니다.
  2. ResolveAll 메서드: 컨테이너에서 지정한 형식의 모든 인스턴스를 검색합니다.
  3. IsRegistered 메서드: 컨테이너에서 지정한 형식이 등록되어 있는지 여부를 확인합니다.

IContainerProvider는 다음과 같이 사용할 수 있습니다.

public class MyViewModel : BindableBase
{
    private readonly IContainerProvider _container;

    public MyViewModel(IContainerProvider container)
    {
        _container = container;
    }

    public void DoSomething()
    {
        // MyService 클래스를 Resolve 메서드를 사용하여 가져옵니다.
        var myService = _container.Resolve<MyService>();

        // MyService 클래스의 메서드를 호출합니다.
        myService.DoSomething();
    }
}

위 예제에서는 MyViewModel 클래스에서 IContainerProvider를 주입받아 Resolve 메서드를 사용하여 MyService 클래스를 가져오고, 이를 사용하여 DoSomething 메서드를 호출하고 있습니다. 이렇게 하면 의존성 관리 기능을 사용하여 클래스 간의 의존 관계를 관리할 수 있습니다.

Prism IContainerExtension

C# Prism에서 IContainerExtension은 Prism 컨테이너를 확장하여 더 많은 기능을 제공하는 인터페이스입니다. Prism 컨테이너는 의존성 주입(Dependency Injection)을 사용하여 클래스 간의 의존 관계를 관리하는 기능을 제공합니다. 이때 IContainerExtension 인터페이스는 이러한 의존성 관리 기능을 보다 쉽게 사용할 수 있도록 합니다.

IContainerExtension은 다음과 같은 기능을 제공합니다.

  1. Register 메서드: 컨테이너에 클래스를 등록합니다.
  2. RegisterInstance 메서드: 컨테이너에 인스턴스를 등록합니다.
  3. RegisterSingleton 메서드: 컨테이너에 싱글톤 인스턴스를 등록합니다.
  4. Resolve 메서드: 컨테이너에서 지정한 형식의 인스턴스를 검색합니다.
  5. ResolveAll 메서드: 컨테이너에서 지정한 형식의 모든 인스턴스를 검색합니다.
  6. IsRegistered 메서드: 컨테이너에서 지정한 형식이 등록되어 있는지 여부를 확인합니다.

IContainerExtension은 다음과 같이 사용할 수 있습니다.

public class MyModule : IModule
{
    private readonly IContainerExtension _container;

    public MyModule(IContainerExtension container)
    {
        _container = container;
    }

    public void RegisterTypes(IContainerRegistry containerRegistry)
    {
        // MyService 클래스를 싱글톤으로 등록합니다.
        _container.RegisterSingleton<MyService>();
    }
}

위 예제에서는 MyModule 클래스에서 IContainerExtension을 주입받아 RegisterTypes 메서드에서 MyService 클래스를 싱글톤으로 등록하고 있습니다. 이렇게 하면 의존성 관리 기능을 사용하여 클래스 간의 의존 관계를 관리할 수 있으며, IContainerExtension을 사용하여 Prism 컨테이너의 기능을 보다 쉽게 사용할 수 있습니다.

Prism EventAggregator

Prism EventAggregator는 Prism 프레임워크에서 제공하는 이벤트 기반 통신 방식입니다. 이벤트 기반 통신은 객체 간의 결합도를 낮추고, 유연한 애플리케이션을 개발하는 데 도움이 됩니다.

EventAggregator는 이벤트를 발행하고, 해당 이벤트를 처리하는 구독자(Subscriber)를 관리합니다. 이를테면, ViewModel에서 이벤트를 발행하고, View에서 해당 이벤트를 처리할 때 EventAggregator를 사용할 수 있습니다.

EventAggregator를 사용하려면, 먼저 이벤트 클래스를 정의하고, 해당 이벤트 클래스를 구독하는 클래스를 구현해야 합니다. 이후 EventAggregator에서 해당 이벤트를 발행하면, 해당 이벤트를 구독하는 모든 클래스에서 이벤트를 처리할 수 있습니다.

다음은 Prism EventAggregator를 사용하는 예시 코드입니다.

이벤트 클래스 정의하기:

public class MyEvent : PubSubEvent<string>
{
}

이벤트 발행하기:

_eventAggregator.GetEvent<MyEvent>().Publish("Hello, Prism!");

이벤트 구독하기:

_eventAggregator.GetEvent<MyEvent>().Subscribe(message => Console.WriteLine(message));

위 코드에서 MyEvent 클래스를 정의하고, 해당 이벤트를 발행할 때 Publish 메서드를 사용합니다. 이벤트를 구독할 때는 Subscribe 메서드를 사용하며, 이벤트 처리 로직을 람다식으로 구현할 수 있습니다.

EventAggregator는 Prism 프레임워크에서 제공하는 기능이므로, App.xaml.cs에서 전역으로 사용할 수 있습니다. 다음과 같이 사용할 수 있습니다.

public partial class App : PrismApplication
{
    private readonly IEventAggregator _eventAggregator;

    public App()
    {
        InitializeComponent();

        _eventAggregator = new EventAggregator();
    }

    protected override void ConfigureContainer()
    {
        Container.RegisterInstance(_eventAggregator);
    }
}

위 코드에서 Container에 EventAggregator를 등록하고, 이후에 View나 ViewModel에서 해당 EventAggregator를 사용할 수 있습니다.

Prism ReginManager

Prism RegionManager는 Prism 프레임워크에서 제공하는 기능 중 하나로, 애플리케이션에서 영역을 나누고, 해당 영역에 View를 등록하고 관리할 수 있는 기능입니다. Prism에서 영역은 UI 컨테이너의 일부를 나타내며, 일반적으로 영역은 탭, 패널, 창 등과 같은 사용자 인터페이스 요소로 표현됩니다.

RegionManager는 등록된 영역과 해당 영역에 등록된 View를 관리하며, View의 활성화 및 비활성화, 탐색 및 이동 등의 작업을 수행할 수 있습니다. 이를테면, View에서 다른 View를 호출하거나, ViewModel에서 다른 View를 활성화하는 등의 작업을 수행할 때 RegionManager를 사용할 수 있습니다.

RegionManager를 사용하려면, 먼저 View에서 사용할 영역을 정의하고, 해당 영역에 View를 등록해야 합니다. 이후 View나 ViewModel에서 해당 영역에 등록된 View를 가져와 사용할 수 있습니다.

다음은 Prism RegionManager를 사용하는 예시 코드입니다.

영역 정의하기:

public static class RegionNames
{
    public const string MainRegion = "MainRegion";
}

영역에 View 등록하기:

public partial class MainWindow : Window
{
    public MainWindow(IRegionManager regionManager)
    {
        InitializeComponent();

        regionManager.RegisterViewWithRegion(RegionNames.MainRegion, typeof(MyView));
    }
}

영역에서 View 가져오기:

_regionManager.RequestNavigate(RegionNames.MainRegion, new Uri("MyView", UriKind.Relative));

Prism Dispatcher

Prism Dispatcher는 Prism 프레임워크에서 제공하는 기능 중 하나로, WPF 및 Xamarin.Forms와 같은 UI 스레드에서 비동기 작업을 수행할 때 사용됩니다. 일반적으로 UI 요소를 업데이트하는 작업은 UI 스레드에서 수행되어야 합니다. 그렇지 않으면 예기치 않은 결과가 발생할 수 있습니다.

Prism Dispatcher를 사용하면, 비동기 작업을 UI 스레드로 전달하여 UI 요소를 업데이트할 수 있습니다. Prism Dispatcher는 WPF의 Dispatcher 및 Xamarin.Forms의 Device.BeginInvokeOnMainThread과 같은 기능을 사용하여 작동합니다.

다음은 Prism Dispatcher를 사용하는 예시 코드입니다.

public class MyViewModel : BindableBase
{
    private readonly IDispatcherService _dispatcherService;

    public MyViewModel(IDispatcherService dispatcherService)
    {
        _dispatcherService = dispatcherService;
    }

    public async Task UpdateDataAsync()
    {
        await Task.Run(() =>
        {
            // 작업 수행
        });

        _dispatcherService.Invoke(() =>
        {
            // UI 업데이트 수행
        });
    }
}

위 코드에서 MyViewModel 클래스에서 IDispatcherService를 사용하여 Prism Dispatcher를 주입받습니다. 이후 UpdateDataAsync 메서드에서 비동기 작업을 수행하고, 작업이 완료되면 _dispatcherService.Invoke를 사용하여 UI 업데이트 작업을 UI 스레드에서 수행합니다.

Prism Dispatcher는 Prism 프레임워크에서 제공하는 서비스 중 하나이며, IEventAggregatorIRegionManager과 같은 다른 서비스와 마찬가지로 의존성 주입을 통해 사용할 수 있습니다.

Prism Invoke

C# Prism에서 Invoke는 다른 스레드에서 UI 업데이트를 수행하는 데 사용됩니다. UI 업데이트는 일반적으로 메인(UI) 스레드에서 수행되어야 합니다. 그러나 백그라운드 스레드에서 실행되는 작업에서 UI를 업데이트하려고 할 때, 이를 직접 수행하면 예외가 발생할 수 있습니다.

따라서, Prism에서는 스레드 간에 안전하게 UI 업데이트를 수행하기 위해 Invoke를 사용합니다. Invoke를 사용하면 백그라운드 스레드에서 UI 업데이트를 요청하고, 이를 메인(UI) 스레드에서 실행합니다. 이를 통해 예외를 방지하고 안전하게 UI를 업데이트할 수 있습니다.

Prism에서는 다음과 같은 방법으로 Invoke를 사용합니다.

  1. Dispatcher.Invoke 메서드 사용: WPF에서 제공하는 Dispatcher 클래스를 사용하여 Invoke를 수행할 수 있습니다.
  2. Application.Current.Dispatcher.Invoke(() => { // UI 업데이트 수행 });
  3. DelegateCommand를 사용한 Invoke: Prism에서 제공하는 DelegateCommand를 사용하여 Invoke를 수행할 수 있습니다.
  4. private DelegateCommand _myCommand; public DelegateCommand MyCommand => _myCommand ?? (_myCommand = new DelegateCommand(() => { // UI 업데이트 수행 }), () => { // CanExecute 로직 수행 }).ObservesCanExecute(() => CanExecute).ObservesProperty(() => IsBusy); // Invoke 사용 Application.Current.Dispatcher.Invoke(() => { _myCommand.RaiseCanExecuteChanged(); });

따라서, Prism에서 Invoke는 안전한 UI 업데이트를 수행하는 데 사용되며, Dispatcher 클래스나 DelegateCommand를 사용하여 구현할 수 있습니다.

Prism Action

Prism에서 Action은 델리게이트의 일종으로, 매개변수를 받지 않고 반환값이 없는 메서드를 나타냅니다. Action은 주로 이벤트 핸들러로 사용되며, 이벤트가 발생하면 등록된 Action이 실행됩니다.

Prism에서는 이벤트를 구독하는 대신, PubSubEvent<T> 클래스를 사용하여 이벤트를 발행(Publish)하고 구독(Subscribe)할 수 있습니다. 이때, 구독자는 Subscribe 메서드를 사용하여 Action<T>을 등록합니다. T는 이벤트 인자의 타입을 나타냅니다. 예를 들어, 다음과 같이 PubSubEvent<string>를 선언하고 Subscribe 메서드를 사용하여 Action<string>을 등록할 수 있습니다.

public class MyEvent : PubSubEvent<string> { }

public class MySubscriber
{
    private readonly MyEvent _myEvent;

    public MySubscriber(MyEvent myEvent)
    {
        _myEvent = myEvent;
        _myEvent.Subscribe(OnMyEvent);
    }

    private void OnMyEvent(string message)
    {
        // 이벤트 처리 로직
    }
}

위 코드에서 MyEvent 클래스는 PubSubEvent<string>를 상속하여 선언됩니다. 이벤트 발행은 MyEvent 클래스의 Publish 메서드를 사용하여 수행할 수 있습니다. MySubscriber 클래스에서는 MyEvent를 주입받고, OnMyEvent 메서드를 Action<string>으로 등록합니다. 이후 MyEvent 클래스에서 이벤트를 발행하면, 등록된 OnMyEvent 메서드가 실행됩니다.

Prism에서는 이벤트 기반 아키텍처를 쉽게 구현할 수 있도록 PubSubEvent<T> 클래스를 제공하며, 이벤트 구독자로 Action<T>을 사용할 수 있습니다.

Prism Resolve

Prism에서 Resolve는 의존성을 해결하기 위한 메서드입니다. Resolve 메서드는 DI 컨테이너에서 지정한 타입의 인스턴스를 반환합니다. DI 컨테이너는 응용 프로그램에서 사용되는 클래스의 객체 인스턴스를 관리하며, 이를 사용하여 객체 간의 의존성을 자동으로 해결할 수 있습니다.

Prism에서는 DI 컨테이너로 IContainerProvider 인터페이스를 사용합니다. IContainerProvider 인터페이스는 Resolve 메서드를 포함한 다양한 메서드를 제공합니다. 예를 들어, 다음 코드에서는 IContainerProvider를 사용하여 MyService 클래스의 인스턴스를 가져옵니다.

public class MyViewModel : BindableBase
{
    private readonly MyService _myService;

    public MyViewModel(IContainerProvider containerProvider)
    {
        _myService = containerProvider.Resolve<MyService>();
    }
}

위 코드에서 MyViewModel 클래스는 MyService 클래스의 인스턴스를 사용해야 합니다. 따라서 IContainerProvider 인터페이스를 주입받고, Resolve 메서드를 사용하여 MyService 클래스의 인스턴스를 가져옵니다.

Resolve 메서드를 사용하여 인스턴스를 가져올 때, DI 컨테이너에서 해당 타입의 인스턴스가 없으면 예외가 발생합니다. 이때, DI 컨테이너에서 인스턴스를 등록하지 않은 경우에는 Register 메서드를 사용하여 인스턴스를 등록할 수 있습니다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함