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
- Prism là gì ? các khái niệm chính trong Prism Library 5.0 for WPF
- Prism Library 5.0 for WPF – Khởi tạo ứng dụng
- Prism Library 5.0 for WPF – Implementing MVVM Pattern
- 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
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:
- 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.
- Thiết lập Shell window. Shell window là nơi chứa các user interface (UI) components khác nhau.
- 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 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
- xóa MainWindow.xaml và tạo mới Shell.xaml
- 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 UnityBootstrapper và MefBootstrapper. 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.
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:
- Tạo module. bạn tạo một module project bằng module class.
- 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
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)
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:
- 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.
- 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.
- 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
- Tạo view
- 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.
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
Pingback: Prism là gì ? các khái niệm chính trong Prism Library 5.0 for WPF | Phạm Duy Anh
Pingback: Prism Library 5.0 for WPF – Implementing MVVM Pattern | Phạm Duy Anh
Pingback: Prism Library 5.0 for WPF – Sử dụng Event Aggregation xây dựng một composite application | Phạm Duy Anh
có video hướng dẫn ko ạ!!!
có video hướng dẫn ko ạ
hi bạn,
mình chưa làm video bạn ạ.
cám ơn bạn đã hỏi.
sai lỗi chính tả quá nhiều, thiếu chuyện nghiệp