Showing posts with label Prism. Show all posts
Showing posts with label Prism. Show all posts

2012-03-18

EventAggregator without Prism

Nếu trước đây vài năm, ai đã từng dùng EventBroker của CAB/SCSF và sau đó là EventAggregator của Prism thì không khó khăn gì nhận ra sự linh hoạt của nó so với cách viết thông thường. Tuy nhiên CAB/SCSF EventBroker khó tách ra thành 1 project, hơn nữa cách tiếp cận WorkItem và attribute có vẻ không hợp với các IoC container library sau này.

Dạo gần đây khi review 1 số dự án junior viết, mình nhận thấy code nhất là phần UI rất lộn xộn và không thể nào đọc được. Hầu như không junior nào có khái niệm phải thay đổi cách tổ chức. Nếu làm lại hết tất cả từ đầu thì không khả thi vì vậy mình tìm các apply 1 phần nhỏ để chỉnh lại đám UI code.

Tất nhiên EventAggregator của Prism theo mình nghĩ sẽ là source code hay nhất có thể dễ dàng modified và đưa vào project đã có. Nếu ai đã làm quen với Prism hay thậm chí chỉ cần biết qua về IoC contaienr library nào đó dễ thấy rằng việc đưa EventAggregator vào có thể dễ dàng dọn dẹp được rất nhiều code garbage. Đây là mô tả của Martin Flower http://martinfowler.com/eaaDev/EventAggregator.html.

OK xem thử code EventAggregator của Prism. Thực sự sau khi xem thì cũng không có nhiều việc phải chỉnh. Hơn nữa license của Prism cũng không cấm modified http://compositewpf.codeplex.com/license. Chỉ cần copy các files trong v4/PrismLibrary/Desktop/Prism/Events. Có 1 phần nhỏ để chỉnh lại là DefaultDispatcher.Desktop.cs. Class DefaultDispatcher dùng để marshal code trong trường hợp thread cần marshal đến là UI thread. Trước khi modify PL cũng search qua 1 số code trên Internet nhưng 1 số code lại comment luôn phần dispatcher trong trường hợp scope là UI. Tuy nhiên cũng không khó khăn gì nếu dùng SynchronizationContext như cách BackgroundWorker hay EventBroker của CAB.

Trong với WPF đơn giản code như sau:

if (Application.Current != null)
{
    Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, method, arg);
}

Nếu dùng code với console app hay WinForms thì cần thay bằng SynchronizationContext. Nếu muốn tìm hiểu SynchronizationContext là gì thì trên CodeProject có bài 2 phần giải thích về class này http://www.codeproject.com/Articles/31971/Understanding-SynchronizationContext-Part-I.

Code sau khi chỉnh như sau:

namespace Microsoft.Practices.Prism.Events
{
    /// Wraps the Application Dispatcher.

    public class DefaultDispatcher : IDispatcherFacade    {
        /// Forwards the BeginInvoke to the current application's .

        /// method Method to be invoked.
        /// arg Arguments to pass to the invoked method.
        public void BeginInvoke(Delegate method, object arg)
        {
#if WPF
            if (Application.Current != null)
            {
                Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, method, arg);
            }
#else

            if (SynchronizationContext.Current != null)
            {
                SynchronizationContext.Current.Send(data =>
                {
                    try
                    {
                        ((Delegate)data).DynamicInvoke(arg);
                    }
                    catch (TargetInvocationException ex)
                    {
                        Debug.WriteLine("There is an exception when marshal to UI thread: " + ex.Message);
                    }
                }, method);
            }
            else
            {
                try
                {
                    method.DynamicInvoke(arg);
                }
                catch (TargetInvocationException ex)
                {
                    Debug.WriteLine("There is an exception when marshal to UI thread: " + ex.Message);
                }
            }
#endif
        }
    }
}

2010-07-10

WPF and Silverlight Framework - Dùng Prism để xây dựng ứng dụng WPF/Silverlight


Sử dụng Prism để xây dựng ứng dụng WPF/Silverlight

Khi mấy cái projects sẽ làm đụng đến WPF thì mình lại phải đi tìm hiểu trước 1 đám framework mới hy vọng chọn 1 cái khả dĩ dùng được rồi document lại, note lại những thứ cần chú ý rồi viết hướng dẫn ... Tất nhiên là try khác với use vì vậy để sử dụng được hay không cũng try cái đã. Nếu personal thì chắc cũng chẳng cần framework, mình chỉ viết vài cái toy thì túc tắc cái gì không giải quyết được lại Googling. Có thể list ra nhiều framework nhưng có vẻ nổi nhất là Caliburn và Prism hay ít nổi hơn là WAF. Đã định try thật kỹ cái Prism từ 2 năm trước :D nhưng rồi cũng xem sơ sơ. Giờ đã xem được 1 đoạn dài nên ngồi viết lại chút xíu thay đổi không khí. Đến khi xong thằng này thì sẽ coi tiếp Caliburn xem. Nhớ lại cái đám CAB/SCSF giờ cũng quăn 1 đống, hic xung quanh phát triển nhanh quá theo ko kịp.

Giới thiệu
Nối tiếp CAB/SCSF Patterns & Practices phát triển một guidance mới với mục tiêu hỗ trợ việc xây dựng ứng dụng với WPF, phiên bản đầu tiên gọi là Prism 1.0 hay Composite Application Guidance for WPF version 1.0 vào tháng 6 năm 2008. Sau đó Prism được bổ sung Silverlight gọi là Prism 2.1 hay Composite Application Guidance for WPF and Silverlight version 2.1 dành cho Silverlight 3 được ra mắt vào tháng 10 2009. Version tiếp theo là Prism 2.2 dành cho Silverlight 4 vào tháng 5 năm 2010 là một minor update của Prism 2.1 (các project chuyển qua Visual Studio 2010, target vào Silverlight 4 và update Silverlight Toolkit).

Hiện tại Prism có version 4.0 drop 3 dành cho Silverlight 4 vào ngày 1 tháng 7 năm 2010 (bài viết này là ngày 10/7/2010) với Microsoft Visual Studio 2010, Microsoft .NET Framework 4.0, Microsoft Silverlight 4, Microsoft Silverlight 4 Tools for Visual Studio 2010.

Composite Application Guidance là gì?
Là một bộ các guidance tức các chỉ dẫn bao gồm các tham khảo, ví dụ cài đặt (reference implementation), reusable library code được gọi là Composite Application Library, tài liệu, QuickStarts và hand-on labs. Đối tượng hướng tới là các software architects và developers thực hiện xây dựng các enterprise-level applications sử dụng WPF hay Silverlight.

Những loại ứng dụng này thông thường bao gồm nhiều màn hình screens, nhiều tính năng, khả năng tương tác với user linh hoạt, hiển thị dữ liệu trực quan ... Một phần quan trọng là các ứng dụng này có đặc điểm "built to last" và "built for change". Có nghĩa là các ứng dụng được mong đợi là có vòng đời tính bằng nhiều năm và có khả năng thay đổi theo những yêu cầu mới mà các yêu cầu này chưa biết trước (new and unforeseen requirements). Vì vậy ứng dụng ban đầu có thể nhỏ và được tạo thành từ những thành phần liên độc lập, kết yếu với nhau (composed of multiple independent and loosely-coupled pieces).

Các phần có trong Guidance
Guidance bao gồm các thành phần sau:
  • Composite Application Library và Unity binaries hay source code
  • StockTrader Reference Implementation là một ứng dụng mẫu dựa trên yêu cầu thực tế (real-world scenario). Đây là một tham khảo tốt để tìm hiểu những vấn đề được xác định và giải quyết như thế nào khi xây dựng composite applications.
  • 4 QuickStarts: UIComposition QS, EventAggregation QS, Modularity QS và Commanding QS là những ứng dụng nhỏ focus vào một mục tiêu cụ thể như UI composition, modularity, commanding, event aggregation ...
  • Composite Application Guidance Hands-On Lab
  • API Documentation
  • Composite Application Guidance Documentation


Stock Trader RI

Documentation
Có thể dùng diagram dưới đây để xem các thành phần trong Composite Application Guidance Documentation.
Composite Application Guidance

Trong trường hợp đã làm quen với CAB, Prism có một tài liệu riêng cho CAB developer Composite Application Guidance for CAB Developers

Home site
Home site của Prism tại địa chỉ http://compositewpf.codeplex.com/.

System requirements
Các yêu cầu phụ thuộc vào 2 vấn đề chính cần chú ý là phiên bản của Visual Studio và Silverlight.
Nếu dùng Visual Studio 2010 hay Silverlight 4 thì version của Prism tương ứng là Prism 2.2 (for Silverlight 4) - May 2010 hay Prism 4.0 Drop 3.
Nếu dùng Visual Studio 2008 thì chúng ta dùng Prism 2.1. Các yêu cầu cụ thể như sau:
·         Microsoft Visual Studio 2008 SP1
·         Microsoft .NET Framework 3.5 SP1 (.NET Framework 3.5 bao gồm WPF)
·         Microsoft Silverlight (nếu tạo ứng dụng Silverlight)
·         Microsoft Silverlight 3 Tools for Visual Studio 2008 SP1 (nếu tạo ứng dụng Silverlight)

Tham khảo
Article Patterns For Building Composite Applications With WPF - MSDN Magazine September/2008 
Prism resources at Channel9 MSDN