Thứ Năm, 29 tháng 4, 2010

Khái niệm Shell của CAB và SCSF

Trong CAB và SCSF có nhiều khái niệm mà chúng ta cần ghi nhớ, và hiểu rõ để ứng dụng vào trong quá trình chúng ta xây dựng các software application.
Để hiểu rõ các khái niệm của thành phần này, mình cố gắn giải thích các khái niệm và kèm them các thành phần code để diễn giải các khái niệm đó.
Hôm nay mình nói đến khái niệm đầu tiên của mô hình và là khái niệm chủ chốt xuyên suốt một application.


Shell là gì ? .

Shell chính là một main Form của application, thay vì trước kia các bạn thường tạo một Window Form Application. và có một main Form làm bộ khung cho chương trình. Nay các bạn tạo một CAB và SCSF thì Shell chính là một main Form.

Câu hỏi ở đây là sao phải là Shell mà không như bình thường chúng ta tạo một main Form ?
Đây là lý do chúng ta cần tìm hiểu khi xây dựng ứng dụng với Composite Application Block . Shell là một Startup Form (được khởi chạy khi chương trình được mở)

Như hình minh họa ở trên, một Shell nó còn đem theo các thành phần khởi tạo khác :
  • Workspaces
  • UI Extension Sites
  • Commands
  • SmartPartInfo
  • Activation
  • Tạo  RootWorkItem mặc định, 
  • Add bất kỳ service hay module nào được định nghĩa trong profile hoặc configuration của ứng dụng.
Tất cả các thuật ngữ trên chúng ta sẽ được tìm hiểu qua các bài viết khác.

Bây giờ chúng ta có ngay một ví dụ để tạo ra một Shell . Dĩ nhiên các bạn yên tâm, sau này khi đã hiểu rõ về CAB và SCSF thì việc tạo Shell là default của việc tạo một Smart Client Application. Chúng ta chỉ thừa hưởng chúng thôi.

Bước 1 : Bạn sẽ tạo một solution chứa 2 project Window application Form.
  1. Project ShellDemo ( Shell này là một startup form của chương trình khi chạy)
  2. Project DemoModule (ModuleForm này là một module của chương trình)
Bước 2 : tiếp theo là ta cần hai project này cùng được build trong một thư mục chung .
Tạo ra một thư mục tên  bin ngay thư mục gốc của solution.
Vào Properties của mỗi project trên và chọn tab Build. chỉnh lại đường dẫn của Output Path là thư mục bin vừa tạo.

Bước 3 : mỗi project bạn cần references các gói dll sau
  1. Microsoft.Practices.CompositeUI.dll
  2. Microsoft.Practices.CompositeUI.WinForms.dll
  3. Microsoft.Practices.ObjectBuilder.dll

hãy chép 3 file này vào cùng thư mục bin ở trên, sau đó mỗi project hãy references đến nó.

Bước 4: Chúng ta bắc đầu code nhé. Đầu tiên là Project ShellDemo, Form1 tôi có thể đổi tên là ShellForm. click vào file program.cs

 [code]
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Microsoft.Practices.CompositeUI;
using Microsoft.Practices.CompositeUI.WinForms;

namespace ShellDemo
{
    public class Program : FormShellApplication
    {
        ///
        /// The main entry point for the application.
        ///

        [STAThread]
        static void Main()
        {
            new Program().Run();
        }
    }
}
 [/code]
  • Using Microsoft.Practices.CompositeUI.WinForms, Microsoft.Practices.CompositeUI
  • Chúng ta inherit từ một class tên là FormShellApplication, class này dĩ nhiên được cung cấp từ CAB, đây chính là thành phần chính tạo nên một Shell, bên trong là một WorkItem cũng được cung cấp từ CAB. nó tạo ra một RootWorkItem, kế tiếp là form trong project có tên là ShellForm .
  • Trong hàm static void Main() bạn chỉ cần gọi hàm Run() của Program là đủ.
Bước 5 : Trong Shell nói chung, project ShellDemo của chúng ta cần có một file được đặt tên mặc định là ProfileCatalog.xml, đó là một file module catalog mà CAB cung cấp. dùng để xác định các module sẽ được load. Nội dung của file được viết như sau :

[code]

///solutionprofile xmlns="http://schemas.microsoft.com/pag/cab-profile">
///    modules>
///        moduleinfo assemblyfile="DemoModule.exe"/>
///    modules>
///solutionprofile>
[code]
  1. Đoạn code trên khai báo một module sẽ được  sử dụng trong ứng dụng (load ), trong shell có tên là DemoModule.exe.
  2. Chọn properties của file ProfileCatalog.xml, chình trong Copy to output Derect thành  Copy Alway
Bước 6 : Bây giờ đến project DemoModule, bất kỳ một module nào đó cũng cần được CAB xác định Load , trong bài này ta chỉ đơn giản là cho Load module này lên khi Shell cũng vừa chạy lên.
Chúng ta cần tạo một file class, đừa thừa kế từ class ModuleInit do CAB cung cấp. Tôi đặt tên là DemoModuleInit.cs , và code như sau :

[code]
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Practices.CompositeUI;

namespace DemoModule
{
    public class DemoModuleInit : ModuleInit
    {
        public override void Load()
        {
            base.Load();
            Form1 form = new Form1();
            form.Show();
        }
    }
}
[/code]
  • Using Microsoft.Practices.CompositeUI;
  • Inherit class ModuleInit
  • Override hàm Load() trong đó ta khởi tạo một đối tượng form và hiển thị lên bằng hàm Show().

Bước 7 : Các bạn build các project . sau đó run chương trình . nên nhớ bạn phải đảm bảo là ShellDemo là StartUp form nhé.

Kết quả thành công là khi bạn chạy chương trình lên thì cả Shell được hiển thị và Form của ModuleForm cũng cùng hiển thị  như một MDI.

Code Demo ở đây

    Không có nhận xét nào:

    Đăng nhận xét