Prism Library 5.0 for WPF – Sử dụng Event Aggregation xây dựng một composite application

Bài viết này sẽ giới thiệu cho bạn các xây dựng một composite application bằng cách sử dụng Event Aggregator service trong Prism Library. Service này có phép bạn thiết lập việc giao tiếp giữa các components trong ứng dụng.

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

 

Kịch bản

Chúng ta sẽ xây dựng ứng dụng như hình bên dưới, Trong cửa sổ này, người dùng có thể thêm tiền cho khách hàng và xem nhật ký hoạt động cho mỗi khách hàng.

Event Aggregation QuickStart

Build và chạy ứng dụng

Các bạn tải source tại đây

sau đó build solution và chạy ứng dụng. để xem cách hoạt động.

Giải thích cách thực hiện

QuickStart làm nổi bật các yếu tố chính tương tác khi sử dụng Event Aggregator service. Phần này mô tả các phần chính của QuickStart, được thể hiện trong minh hoạ sau.

 

 

Sự kiện FundAddedEvent

FundAddedEvent sẽ được raised lên khi người dùng thêm quỹ cho khách hàng. Sự kiện này được dùng để ModuleA và Module B có thể giao tiếp với nhau (in a loosely coupled way). Code bên dưới cho chúng ta thấy event class signature(nguyên mẫu); Lớp mở rộng lớp PubSubEvent , chỉ định FundOrder làm kiểu payload. Code này nằm ở EventAggregation.Infrastructure.Dektop\FundAddedEvent.cs

public class FundAddedEvent : PubSubEvent
{
}

Đoạn mã sau đây là định nghĩa lớp cho lớp FundOrder; Lớp này đại diện cho một lệnh quỹ và chỉ định biểu tượng ticker và mã nhận dạng của khách hàng. Mã này được đặt tại EventAggregation.Infrastructure.Desktop \ FundOrder.cs.

public class FundOrder
{
    public string CustomerId { get; set; }
    public string TickerSymbol { get; set; }
}

Event Publishing

Khi người dùng thêm quỹ cho khách hàng, sự kiện FundAddedEvent được xuất bản bởi lớp AddFundPresenter (đặt tại ModuleA.Desktop \ AddFundPresenter.cs). Đoạn mã sau cho thấy  FundAddedEvent được xuất bản như thế nào.

void AddFund(object sender, EventArgs e)
{
    FundOrder fundOrder = new FundOrder();
    fundOrder.CustomerId = View.Customer;
    fundOrder.TickerSymbol = View.Fund;

    if (!string.IsNullOrEmpty(fundOrder.CustomerID) && !string.IsNullOrEmpty(fundOrder.TickerSymbol))
        eventAggregator.GetEvent().Publish(fundOrder);
}

trong đoạn code bên trên một đối tượng FundOrder được tạo ra và thiết lập giá trị. sau đó FundAddedEvent được lấy ra từ Event Aggregator service và phương thức Publish được gọi. FundOrder được tạo ra sẽ được truyền đi như là tham số của FundAddedEvent .

Event Subscription

moduleB chứa 1 view tên là ActivityView. moduleB khởi tạo 2 instance của view này, 1 cho Customer1 v 1 cho Customer2. code như bên dưới (ModuleB.Desktop\ModuleB.cs)

public void Initialize()
{
    ActivityView activityView1 = Container.Resolve();
    ActivityView activityView2 = Container.Resolve();

    activityView1.CustomerId = "Customer1";
    activityView2.CustomerId = "Customer2";

    IRegion rightRegion = RegionManager.Regions["RightRegion"];
    rightRegion.Add(activityView1);
    rightRegion.Add(activityView2);
}

khi một instance của ActivityView được tạo ra, presenter của nó đănng ký 1 sự kiện sử lý vào FundAddedEvent bằng cách sử dụng một điều kiện filter. Điều kiện filter này định nghĩa một điều kiện mà đối số của sự kiện phải đáp ứng để xử lý sự kiện được gọi. Trong trường hợp này, điều kiện sẽ được đáp ứng nếu lệnh quỹ tương ứng với khách hàng liên quan đến view. Trình xử lý sự kiện chứa mã để hiển thị quỹ mới được bổ sung cho khách hàng trong giao diện người dùng.

Đoạn cod bên dưới hiển thị thuộc tính CustomerId của class ActivityPresenter. trong setter của thuộc tính, một event handler cho sự kiện
FundAddedEvent được đăng ký sử dụng Event Aggregator service.

public string CustomerId
{
    get { return _customerId; }
    set
    {
        _customerId = value;

        FundAddedEvent fundAddedEvent = eventAggregator.GetEvent();

        if (subscriptionToken != null)
        {
            fundAddedEvent.Unsubscribe(subscriptionToken);
        }

        subscriptionToken = fundAddedEvent.Subscribe(FundAddedEventHandler, ThreadOption.UIThread, false, FundOrderFilter);

        View.Title = string.Format(CultureInfo.CurrentCulture, Resources.ActivityTitle, CustomerId);
    }
}

Dòng sau, trích xuất từ mã trước, cho thấy trình xử lý sự kiện được đăng ký như thế nào với sự kiện FundAddedEvent.

subscriptionToken = fundAddedEvent.Subscribe(FundAddedEventHandler, ThreadOption.UIThread, false, FundOrderFilter);
  • FundAddedEventHandler action. Trình xử lý sự kiện này được thực hiện khi nút Thêm được nhấp và điều kiện lọc được thỏa mãn.
  • Tuỳ chọn ThreadOption.UI. Tùy chọn này chỉ định rằng trình xử lý sự kiện sẽ chạy trên user interface thread.
  • KeepSubscriberReferenceAlive flag. Cờ này là false và chỉ ra rằng lifetime của tham chiếu của đăng ký không được quản lý bởi sự kiện. Điều này được đặt thành false bởi vì lifetime của đăng ký, presenter class, được quản lý bởi view, có chứa một tham chiếu đến nó.
  • filter. Bộ lọc này là một điều kiện chỉ định rằng trình xử lý sự kiện được gọi chỉ khi quỹ được thêm vào khách hàng tương ứng của view.

Bài viết Prism Library 5.0 for WPF – Sử dụng Event Aggregation xây dựng một composite application được dịch từ

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

2 thoughts on “Prism Library 5.0 for WPF – Sử dụng Event Aggregation xây dựng một composite application

  1. Pingback: Prism Library 5.0 for WPF – Khởi tạo ứng dụng | Phạm Duy Anh

  2. Pingback: Prism Library 5.0 for WPF – Triển khai mô hình MVVM | Phạm Duy Anh

Leave a Reply

Your email address will not be published. Required fields are marked *