Prism Library 5.0 for WPF – Khởi tạo ứng dụng

Bài viết này sẽ đề cập đến những gì xảy ra để 1 ứng dụng WPF -Prism khởi động và chạy. Một ứng dụng Prism yêu cầu đăng ký và cấu hình trong quá trình khởi động ứng dụng-được gọi là khởi động ứng dụng. Quá trình khởi động Prism bao gồm việc tạo và cấu hình một catalog mô-đun, tạo ra một container phụ thuộc như Unity, cấu hình bộ điều hợp vùng mặc định (default region adapter) cho thành phần UI, tạo và khởi tạo shell view, và khởi tạo các mô-đun.

Các bài liên quan

  1. Prism là gì ? các khái niệm chính trong Prism Library 5.0 for WPF
  2. Prism Library 5.0 for WPF – Khởi tạo ứng dụng
  3. Prism Library 5.0 for WPF – Implementing MVVM Pattern
  4. Prism Library 5.0 for WPF – Sử dụng Event Aggregation xây dựng một composite application

Một bootstrapper là một lớp có trách nhiệm khởi tạo một ứng dụng được xây dựng bằng cách sử dụng Thư viện Prism. Bằng cách sử dụng một bootstrapper, bạn có nhiều kiểm soát như thế nào các thành phần Thư viện Prism được nối với ứng dụng của bạn.

Các bước cơ bản của quá trình bootstrapping

Các bước cơ bản của quá trình bootstrapping

Tạo shell

  • Trong ứng dụng WPF, StartupUri=”MainWindow.xaml” trong App.xaml sẽ thiết lập MainWindow được start đầu tiên.
  • Trong ứng dụng được tạo bởi thư viện Prism, Bootsraper sẽ chịu trách nhiệm tạo ra shell hoặc main window. Điều này là do shell phụ thuộc vào các dịch vụ, chẳng hạn như Trình quản lý vùng, cần phải được đăng ký trước khi trình bao có thể được hiển thị.

Sự quyết định

khi bạn đã chọn sử dụng  thư viện Prism, có một vài thứ khác bạn phải quyết định

  • Bạn sẽ cần phải quyết định sử dụng MEF, Unity hoặc container khác cho dependency injection container. Điều này sẽ xác định lớp bootstrapper bạn nên dùng và liệu bạn có cần tạo một bootstrapper cho một vùng chứa khác hay không.
  • Bạn nên suy nghĩ về các dịch vụ cụ thể mà bạn muốn ứng dụng. Chúng sẽ cần phải được đăng ký với container.
  • xác định log service được xây dựng có đủ cho bạn không, nếu cần bạn có thể tạo một logging service khác.
  • Xác định cách thức các mô-đun sẽ được phát hiện bởi ứng dụng: thông qua các khai báo mã rõ ràng, các thuộc tính mã trên các mô-đun được phát hiện thông qua chức năng quét, cấu hình hoặc XAML.

Kịch bản cơ bản

Tạo một trình tự khởi động là một phần quan trọng trong việc xây dựng ứng dụng Prism. Phần này mô tả làm thế nào để tạo một bootstrapper và tùy chỉnh nó để tạo shell, cấu hình các dependency injection container, đăng ký các dịch vụ mức ứng dụng và làm thế nào để tải và khởi tạo các mô-đun.

Tạo Boostrapper cho ứng dụng của bạn

Nếu bạn chọn sử dụng Unity hoặc MEF như dependency injection container, tạo một bootstrapper  đơn giản cho ứng dụng của bạn thật dễ dàng. Bạn sẽ cần tạo một lớp mới xuất phát từ MefBootstrapper hoặc UnityBootstrapper. Sau đó thực thi phương thức CreateShell. Theo tùy chọn, bạn có thể ghi đè lên phương thức InitializeShell cho khởi tạo cụ thể của shell.

Thực hành tạo ứng dụng sử dụng thư viện Prism 5.0

Trong bài thực hành này chúng ta sẽ

  • Tạo mới một solution dựa trên Prism Library.
  • tạo mới và load một module
  • Tạo mới và hiển thị một view lên shell window.

Chuẩn bị

Các bước chính

Trong phần này chúng ta sẽ có 3 task chính

  • Task 1: tạo một Solution sử dụng Prism Library 5.0
  • Task 2: Thêm một Module
  • Task 3: Thêm 1 View

Task 1: Tạo một Solution sử dụng Prism Library 5.0

Để tạo một solution sử dụng Prism Library 5.0, chúng ta có 3 bước chính sau:

  1. Tạo một solution với shell project. Bạn tạo một WPF Application project đây là solutions cơ bản được xây dựng theo Prism Library. project ngày được hiểu là shell project.
  2. Thiết lập Shell window. Shell window là nơi chứa các user interface (UI) components khác nhau.
  3. Thiết lập bootstrapper cho ứng dụng. trong task này thiết lập code để khởi tạo ứng dụng.

 

Tạo một solution với shell project

Trong visual studio tạo mới một project WPF Application,  và đặt tên là HelloWorld.Desktop

Trong visual studio tạo mới một project WPF Application, và đặt tên là HelloWorld.Desktop

Trong project này thêm references NuGet packages bên dưới

Shell window là của sổ cao nhất của ứng dụng dựa trên Prism Library. Cửa sổ này là nơi chưa các UI components. Cửa sổ này thiết lập tổng thể cho ứng dụng. ( hay chúng ta có thể hiểu là một Master page như khi làm web)

Thiết lập Shell window

Có 2 cách

  1. xóa MainWindow.xaml và tạo mới Shell.xaml
  2. rename MainWindow.xaml thành Shell.xaml

Regions

trong Shell.xaml, thêm namespace vào Window element.

xmlns:prism="http://www.codeplex.com/prism"

Thay thế Grid control trong shell window bằng mộtt ItemsControl control và đặt tên là MainRegion, như code bên dưới.

<Window x:Class="HelloWorld.Desktop.Shell"
    xmlns:prism="http://www.codeplex.com/prism"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Hello World" Height="300" Width="300">
    
    <ItemsControl Name="MainRegion"/>

</Window>

Trong ItemsControl thiết lập property prism:RegionManager.RegionName thành “MainRegion”, như bên dưới. Thuộc tính đính kèm này chỉ ra rằng một vùng có tên MainRegion được liên kết với control.

<ItemsControl Name="MainRegion" prism:RegionManager.RegionName="MainRegion"/>

Bootstrapper

Bootstrapper chịu trách nhiệm khởi tạo một ứng dụng được xây dựng bằng Thư viện Prism. Thư viện Prism bao gồm các lớp UnityBootstrapperMefBootstrapper. Thực hiện hầu hết các chức năng cần thiết, để sử dụng Unity hoặc MEF như là container trong ứng dụng của bạn ..

Thiết lập bootstrapper cho ứng dụng

1. Tạo mới 1 class tên Bootstrapper.cs vào HelloWorld project

2. Thêm using ở trên cùng file. You will use them to refer to elements referenced in the UnityBootstrapper class. Bạn sẽ sử dụng chúng để tham khảo các phần tử được tham chiếu trong lớp UnityBootstrapper.

using System.Windows;
using Microsoft.Practices.Prism.Modularity;
using Microsoft.Practices.Prism.UnityExtensions;
using Microsoft.Practices.Unity;

3. Kế thừa lớp UnityBootstrapper

class Bootstrapper : UnityBootstrapper
{
}

4. Override phương thức CreateShell trong Bootstrapper class. Phương thức này, tạo ra một instance của shell window và return nó, như code bên dưới.

protected override DependencyObject CreateShell()
{
    return new Shell();
}

5. Override phương thức InitializeShell trong Bootstrapper class. Phương thức này để hiển thị shell cho người dùng.

protected override void InitializeShell()
{
    base.InitializeShell();

    Application.Current.MainWindow = (Window)this.Shell;
    Application.Current.MainWindow.Show();
}

6. Override phương thức ConfigureModuleCatalog. Trong template của phương thức, bạn cần nạp module catalog với các module. module catalog interface là Microsoft.Practices.Prism.Modularity.IModuleCatalog, và nó chứa metadata cho tất cả các mô-đun trong ứng dụng. Bởi vì ứng dụng không chứa các mô-đun vào thời điểm này nên việc thực hiện phương pháp ConfigureModuleCatalog chỉ cần gọi thực hiện cơ sở và trả về. Bạn có thể dán đoạn mã sau trong lớp Bootstrapper để thực hiện phương thức.

protected override void ConfigureModuleCatalog()
{
    base.ConfigureModuleCatalog();
}

7. load module, sẽ nói chi tiết hơn ở bên dưới

8. Mở file App.xaml.cs và cập nhật lại hàm Startup như bên dưới

public partial class App : Application
{    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        Bootstrapper bootstrapper = new Bootstrapper();
        bootstrapper.Run();
    }

9. Mở file App.xaml và xóa attribute StartupUri

<Application x:Class="HelloWorld.Desktop.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Application.Resources>
         
    </Application.Resources>
</Application>

10. Build và run the application. Bạn sẽ thấy Hello World window như bên dưới.

cua so trong

Task 2: Thêm một Module

Trong task này chúng ta sẽ tạo một module và thêm nó vào solution. Một module trong Prism là một đơn vị logic của ứng dụng. Các bước để thêm một module:

  1. Tạo module. bạn tạo một module project bằng module class.
  2. Cấu hình để load module. Trong nhiệm vụ này, bạn cấu hình ứng dụng của bạn để nạp module.

Tạo module

1. Thêm mộ project mới và chọn loại là Class Library đặt tên là HelloWorldModule

HelloWorldModule

2. Thêm các references, click chuột phải lên HelloWorldModule project trong Solution Explorer, và click Add Reference. Trong Add Reference dialog box, chọn Assemblies tab, và chọn các assemblies bên dưới, sau đó click OK:

  • PresentationCore.dll
  • PresentationFramework.dll
  • WindowsBase.dll
  • System.Xaml.dll

3. Thêm reference  cho module theo Prism Library assemblies. Để làm việc này, right-click lên HelloWorld.Desktop solution trong Solution Explorer,và click Manage NuGet Packages for Solution. Tìm và chọn:

  • Prism

trong Selected Projects bên phải, chọn HelloWorldModule, và click install.  ( ví dụ như hình bên dưới)

Manage NuGet Packages for Solution

4. Rename Class1.cs thành HelloWorldModule.cs

5. mở file HelloWorldModule.cs và thêm using

using Microsoft.Practices.Prism.Modularity;

6 . kế thừa IModule interface

public class HelloWorldModule : IModule
{
}

7. thêm phương thức Initialize trống

public void Initialize()
{
}

8. chúng ta thêm 2 thư mục sau vời module

  • Services. chứa service implementations và service interfaces.
  • ViewModels. Chứa view models.

9. Build solution

Tại thời điểm này, solution đã dựa trên Thư viện Prism với một mô-đun. Tuy nhiên, mô-đun này không được nạp vào ứng dụng. Phần sau sẽ mô tả việc tải mô-đun và cách bạn có thể tải các mô-đun bằng Thư viện Prism.

Module trong vòng đời Ứng dụng

Các mô-đun đi qua quy trình ba bước trong quá trình khởi động ứng dụng:

  1. Mô-đun được phát hiện bởi module catalog. module catalog chứa một tập hợp metadata về các mô-đun này. metadata  có thể được sử dụng bởi module manager service.
  2. module manager service điều phối việc khởi tạo mô-đun. Nó quản lý việc truy xuất và khởi động tiếp theo của mô-đun. Nó tải mô-đun – lấy chúng nếu cần thiết – và xác nhận chúng.
  3. Cuối cùng, trình quản lý mô-đun khởi tạo mô-đun và gọi phương thức Initialize của mô-đun.

 

Gắn Module Catalog vào

Thư viện Prism cung cấp một số cách để gắn Module Catalog. Trong WPF, bạn có thể nhập Module Catalog từ code, từ tệp XAML, từ tệp cấu hình hoặc từ một thư mục. Thủ tục sau giải thích làm thế nào để gắn Module Catalog từ code để nạp module HelloWorldModule vào ứng dụng HelloWorld.Desktop.

Gắn  module catalog với HelloWorld module từ code

1. Trong Shell project, thêm một referenct đến module projecct. click phải lên  HelloWorld.Desktop project, và click Add Reference. trong Reference Manager dialog box, clickSolution tab, chọn HelloWorldModule project, và click OK

2. Mở Bootstrapper.cs file and xem hàm ConfigureModuleCatalog.

protected override void ConfigureModuleCatalog()
{
    base.ConfigureModuleCatalog();
}

ModuleCatalog class được dùng để định nghĩa application’s modules từ code—nó implement các method của IModuleCatalog interface và thêm  AddModule method để nhà phát riển đăng ký thủ công Modules được load trong ứng dụng.

public ModuleCatalog AddModule(Type moduleType, InitializationMode initializationMode, params string[] dependsOn)

AddModule method trả về ModuleCatalog và có các tham số sau

  • System.Type của module được load
  • Initialization mode. nó sẽ quyết định module được khởi tạo thế nào. các giá trị InitializationMode.WhenAvailable và InitializationMode.OnDemand.
  • Mảng chứa tên của các module phụ thuộc (nếu có). những module này sẽ được load trước module để đảm bảo module phụ thuộc available khi nó được load

3. cập nhật ConfigureModuleCatalog method để đăng ký HelloWorldModule module với module catalog instance. Code như bên dưới:

protected override void ConfigureModuleCatalog()
{
    base.ConfigureModuleCatalog();
    ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog;
    moduleCatalog.AddModule(typeof(HelloWorldModule.HelloWorldModule));
}

Trong ví dụ này, các mô đun được tham chiếu trực tiếp bởi shell. Đó là lý do tại sao ví dụ này có thể sử dụng typeof (Module) để thêm mô-đun vào danh mục. Nhưng hãy lưu ý rằng các mô-đun có loại chưa có sẵn cũng có thể được thêm vào danh mục.
Chế độ khởi tạo WhenAvailable là giá trị mặc định nếu không có chế độ khởi tạo nào được chỉ định.

4. Build và chạy ứng dụng.

Task 3: Thêm một View

trong task này chúng ta sẽ tạo và thêm một view vào HelloWorldModule module. Việc tạo view gồm 2 bước

  1. Tạo view
  2. Hiển thị view trong một region

Tạo một view

1. Thêm một WPF user control vào module. right-click trên Views folder trong Solution Explorer, chọnn Add, click New Item. Trong Add New Item dialog box, chọn User Control (WPF) template, đặt tên là HelloWorldView.xaml, và click Add.

2. thêm “Hello World” text block vào view.

<UserControl x:Class="HelloWorldModule.Views.HelloWorldView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <TextBlock Text="Hello World" Foreground="Green" HorizontalAlignment="Center" VerticalAlignment="Center" FontFamily="Calibri" FontSize="24" FontWeight="Bold"></TextBlock>
    </Grid>
</UserControl>

3. lưu file lại.

Bài viết này chưa đề cập đến tạo view theo Model-View-ViewModel (MVVM) pattern. Tôi sẽ đề cập ở bài viết

.

Region Manager

Để thị thị một view trong shell
1. Mở fileHelloWorldModule.cs . Thêm using Microsoft.Practices.Prism.Regions; ở phía trên
2. Thêm một biến private read-only instance để chứa region manager.

private readonly IRegionManager regionManager;

3. Thêm một constructor cho HelloWorldModule class để nhận manager instance thông qua constructor dependency injection và lưu nó vào biến regionManager instance. Tạo một constructor có paramater loại là type Microsoft.Practices.Prism.Regions.IRegionManager. code như bên dưới.

public HelloWorldModule(IRegionManager regionManager)
{
  this.regionManager = regionManager;
}

4. Đăng ký View vào region

public void Initialize()
{    regionManager.RegisterViewWithRegion("MainRegion", typeof(Views.HelloWorldView));
}

Tên của region phải đúng với tên được định nghĩa trong thuộc tính RegionName của region.

5. Build và chạy ứng dụng. các bạn sẽ thấy kết quả như bên dưới.

Hello World message
Source code tham khảo

Bài viết Prism Library 5.0 for WPF – Khởi tạo ứng dụng được dịch từ

https://msdn.microsoft.com/en-us/library/ff921141(v=pandp.40).aspx

7 thoughts on “Prism Library 5.0 for WPF – Khởi tạo ứng dụng

  1. Pingback: Prism là gì ? các khái niệm chính trong Prism Library 5.0 for WPF | Phạm Duy Anh

  2. Pingback: Prism Library 5.0 for WPF – Implementing MVVM Pattern | Phạm Duy Anh

  3. Pingback: Prism Library 5.0 for WPF – Sử dụng Event Aggregation xây dựng một composite application | Phạm Duy Anh

Leave a Reply

Your email address will not be published.