3.3.5.1.Mô hình kết nố

Một phần của tài liệu Ứng dụng công nghệ sharepoint để xây dựng cổng thông tin nội bộ dùng trong các doanh nghiệp (Trang 82)

Hai Web Parts kết nối với nhau được thực thi trong một cặp publisher/subscriber. Bất cứ giá trị thay đổi nào đưa ra bởi Provider đều được phản hồi bởi consumer, mô hình này bao gồm hai thực thể tương tác với nhau: một provider cung cấp và một hoặc nhiều consumer khách hàng.

Provider được gọi để thu thập các dữ liệu công cộng của nó và làm cho nó có khả năng đăng ký với người gọi. Consumers được gọi để thu về các dữ liệu hiển thị và dựa vào đó cập nhật các vùng giao diện của nó. Hình sau cung cấp một khung nhìn mức cao của mô hình kết nối này:

Hình vẽ 3.27: Khung nhìn mức cao về mô hình kết nối

Trong phần này ta chỉ đề cập đến mô hình kết nối ICellProvider/ICellConsumer. Thông thường có một vài cặp giao diện mà các Web Parts có thể thi hành để thực hiện kết nối, hai giao diện đơn giản nhất đó là ICellProvider và ICellConsumer.

Một provider Web Part là một Web Part mà thực thi giao diện ICellProvider, mặt khác một consumer Web Part phải thực thi giao diện ICellConsumer. ICellProvider được định nghĩa như sau:

public interface ICellProvider {

// Events

event CellProviderInitEventHandler CellProviderInit; event CellReadyEventHandler CellReady;

// Methods

void CellConsumerInit(object sender,

CellConsumerInitEventArgs cellConsumerInitEventArgs); }

Một provider phải chứa mã để sinh ra một cặp các sự kiện tới consumer và chứa đựng mã điều khiển các sự kiện của consumer , giao diện ICellConsumer mang tính đối ngẫu với giao diện ICellProvider và như sau:

public interface ICellConsumer {

// Events

event CellConsumerInitEventHandler CellConsumerInit;

// Methods

void CellProviderInit(object sender,

CellProviderInitEventArgs cellProviderInitArgs); void CellReady(object sender,

CellReadyEventArgs cellReadyArgs); }

Hai giao diện trên ánh xạ lẫn nhau: mỗi sự kiện phát sinh bởi giao diện này sẽ tìm một phương thức điều khiển trong giao diện kia và ngược lại. Chẳng hạn sự kiện CellReady của ICellProvider theo thiết kế nó sẽ được phát sinh để báo cho consumers biết rằng dữ liệu mới đã có hiệu lực. Vậy thì bằng cách nào mà một consumer có thể được báo tin về điều đó? Vấn đề được giải quyết như sau, cónumer

thực thi phương thức CellReady trong giao diện ICellConsumer. Lưu ý ở đây là không có sự tương tác trực tiếp giữa hai Web Part mà có một thành phần trung gian (chính là SharePoint người tạo ra môi trường thực thi) đã đảm bảo việc ánh xạ mỗi sự kiện với phương thức tương ứng theo cả 2 hướng (từ provider đến consumer và ngược lại).

3.3.5.2.Sinh ra các Web Part kết nối

Ngoài các giao diện đã kể ở trên, có một vài phương thức phức tạp hơn để các Web Parts tương tác với nhau và chúng được định nghĩa trong lớp cơ sở WebPart. Môi trường mà SharePoint tạo ra sẽ gọi đến các phương thức đó trước khi các Web Part được sinh ra. Sau đây ta sẽ liệt kê ra các bước cơ bản về vòng đời của các Web Parts kết nối:

 Với mỗi cặp các Web Parts kết nối thì cơ sở hạ tầng Web Parts sẽ gọi phương thức EnsureInterfaces trên provider và consumer. EnsureInterfaces

là một phương thức Web Parts có khả năng cài đè, nó cung cấp cơ sở hạ tầng với các thông tin cho mỗi loại giao diện đang được thực thi, một tham chiếu tới Web Part và số lượng tối đa các kết nối được phép.

 Với mỗi cặp các Web Parts kết nối, cơ sở hạ tầng Web Part gọi phương thức

CanRunAt để biết được mỗi Web Parts có thể thi hành từ đâu (từ client và/hoặc từ server dựa trên cấu hình hiện tại).

 Phương thức PartCommunicationInit được gọi cho provider và sau đó là cho consumer, cả hai Web Part được báo tin rằng kết nối đã được thiết lập và đảm bảo rằng các điều khiển con của chúng đã được thiết lập.

 Phương thức PartCommunicationInit được gọi cho provider. Phương thức này có thể tùy biến phát sinh ra sự kiện CellProviderInit, nếu phát sinh sự kiện thì nó phải được điều khiển bởi cơ sở hạ tầng Web Part và nhất thiết phải gọi đến phương thức tương ứng trên consumer. Trong sự kiện

CellProviderInit, provider cung cấp một đặc tả về các trường mà nó đang xuất bản. Trong phương thức tương ứng, consumer có thể kiểm chứng những

loại giữ liệu gì provider sẽ gửi đi. Với những trường không được chấp nhận thì một ngoại lệ sẽ được ném ra.

 Phương thức PartCommunicationInit cũng được gọi trên consumer và có thể tùy biến phát sinh sự kiện CellConsumerInit. Nếu sự kiện phát sinh, nó sẽ được điều khiển bởi cơ sở hạ tầng Web Part và được phục vụ thông qua phương thức CellConsumerInit của provider.

 Phương thức PartCommunicationMain được triệu gọi trên provider để đóng gói bất cứ dữ liệu công cộng nào và báo tin cho consumer thông qua sự kiện

CellReady. Một lần nữa sự kiện được nắm bắt bởi cơ sở hạ tầng bên dưới và được điều khiển thông qua phương thức CellReady của consumer.

Đoạn mã chương trình sau cho thấy một sự thi hành đặc thù của phương thức

PartCommunicationMain trên một Web Part provider. Trong ví dụ này ta đề cập đến một Web Part có tên là EmployeeViewer, nó hiển thị một thuộc tính integer – EmployeeID. Theo đoạn mã này thì Web Part xuất ra ID của nhân viên hiện tại đã được lựa chọn.

public override void PartCommunicationMain() {

if (CellReady != null) {

CellReadyEventArgs cellReadyArgs = new CellReadyEventArgs(); cellReadyArgs.Cell = _employeeID;

CellReady(this, cellReadyArgs); }

Đoạn mã sau chứa sự phản hồi thông thường của consumer cho sự kiện CellReady:

public void CellReady(object sender, CellReadyEventArgs cellReadyArgs) {

if(cellReadyArgs.Cell != null) {

_employeeID = (int) cellReadyArgs.Cell; }

}

Consumer lưu trữ dữ liệu hợp quy cách vào một biến cục bộ cho việc sử dụng sau này. Khi tất cả các bước trên đã hoàn thành, sự kiện OnPreRender được phát sinh trên tất cả các Web Parts cũng như các điều khiển của chúng.

Lưu ý quan trọng ở đây là tất cả các phương thức và sự kiện được liệt kê ở trên thì chỉ sự kiện CellReady của provider và phương thức CellReady của consumer là thực sự cần thiết.

3.3.5.3.Thi hành Provider

Trước hết ta tạo ra một Project Web Part từ Visual Studio .NET, sau đó tạo các Web Part provider và consumer bằng cách thêm vào Project đang xây dựng:

Hình vẽ 3.28: Chọn Provider Web Part

Trình winzard sẽ tự động tạo ra một lớp Web Part mới đã thực thi các giao diện

ICellProviderICellConsumer. Mục đích của ta ở đây là tạo ra một EmployeeViewer Web Part mà hiển thị một vài thông tin cá nhân của một nhân viên đã được định sẵn. ID của nhân viên là một thuộc tính công cộng của Web Part và được định nghĩa các vùng thuộc tính như sau:

[Browsable(true),

Category("Miscellaneous"),

Description("The ID of the selected employee"), DefaultValue(1),

FriendlyName("EmployeeID"),

WebPartStorageAttribute(Storage.Personal)] public int EmployeeID

{

set {_employeeID = value;} }

Như đã nói ở trên, trong sự kiện CellReady ta đã đóng gói dữ liệu của nó và chuyển cho consumer; với khả năng có thể hiển thị và cá nhân hóa thì các thuộc tính cũng hiển thị trên thanh editing box chuẩn của Web Part như hình sau:

Hình vẽ 3.29: Thay đổi thuộc tính Employee ID

Việc dịch mã của Web Part sẽ thi hành các truy vấn dựa vào SQL Server, nắm lấy các thông tin cá nhân về các đặc trưng người dùng như employee ID và đưa ra một bảng hiển thị HTML để hiển thị thông tin, ở đây để làm ví dụ ta có thể chọn cơ sở dữ liệu Northwind.

3.3.5.4.Thi hành Consumer

Viết một consumer Web Part không khó hơn việc thiết lập một provider. Ta lặp lại cùng các bước ở trên để thêm vào một consumer Web Part cho dự án. Nếu cả hai Web part chứa trong cùng một Asembly ta cần tạo ra một DWP file thứ hai.

Trong trường hợp đơn giản nhất ta chỉ cần cài đè phương thức ảo CellReady và thu về bất cứ giá trị nào mà provider cung cấp và cất dữ các giá trị đó.

Phương thức CellReady thu về một đối tượng CellReadyEventArgs mà trong nó có chứa thuộc tính Cell chỉ đến bất cứ giá trị nào mà provider đã cung cấp trong một tham số đối tượng tương tự trong phương thức PartCommunicationMain của nó. Thuộc tính Cell có kiểu object, ta cần ép kiểu để chuyển nó về dạng dữ liệu phù hợp trước khi sử dụng.

Consumer cũng có thể muốn kiểm tra xem dữ liệu mà provider đưa ra có hợp khuôn dạng hay không, để làm điều này ta cần thực thi phương thức

CellProviderInit. Lưu ý ở đây là phương thức này không thể bị bỏ quên vì nó là một phần của giao diện ICellConsumer.

public void CellProviderInit(object sender,

CellProviderInitEventArgs cellProviderInitArgs) {

if (cellProviderInitArgs.FieldName != "EmployeeID") {

throw new NotSupportedException(); }

}

Ở đây lớp CellProviderInitEventArgs đã được điền đầy dữ liệu bởi provider khi provider phát sinh sự kiện CellProviderInit. Sau đây là một đoạn mã chuẩn để làm điều này:

public override void PartCommunicationInit() {

{

CellProviderInitEventArgs cellProviderInitArgs;

cellProviderInitArgs = new CellProviderInitEventArgs(); cellProviderInitArgs.FieldName = "EmployeeID";

cellProviderInitArgs.FieldDisplayName = "Employee ID"; CellProviderInit(this, cellProviderInitArgs);

}} }

Thuộc tính FieldName cho biết tên của đối tượng dữ liệu đang được chuyển giao, dữ liệu này không có cú pháp chính xác – nó có thể là bất cứ thứ gì.

Sau đây là một consumer Web Part đơn giản đọc employee ID thông qua kết nối với provider và hiển thị tất cả các hàng được cung cấp trong thuộc tính year tương ứng.

year là một thuộc tính của Web Part mà ta tạo ra, nó là một thuộc tính công cộng và có thể hiển thị được, ta định nghĩa nó như sau:

[Browsable(true),

Category("Miscellaneous"),

Description("Year of selected orders"), DefaultValue(1997),

FriendlyName("Year"),

WebPartStorageAttribute(Storage.Personal)] public int Year

{

get {return _year;} set {_year = value;}

}

Employee ID và year là hai tham số được sử dụng trong truy vấn SQL mà kết quả truy vấn được hiển thị thông qua một DataGrid đã được thiết lập để trình bày dữ liệu.

private void BuildUI(HtmlTextWriter writer) {

DataGrid _grid = new DataGrid(); _grid.AutoGenerateColumns = true; _grid.Font.Name = "verdana"; _grid.Font.Size = FontUnit.Point(8); _grid.HeaderStyle.Font.Bold = true; _grid.HeaderStyle.BackColor = Color.PaleTurquoise; _grid.HeaderStyle.HorizontalAlign = HorizontalAlign.Center; _grid.DataSource = _data; _grid.DataBind(); _grid.RenderControl(writer); }

Hai Web Part đã được kết nối với nhau

Một phần của tài liệu Ứng dụng công nghệ sharepoint để xây dựng cổng thông tin nội bộ dùng trong các doanh nghiệp (Trang 82)