Bài đăng Phổ biến

Thứ Bảy, 12 tháng 2, 2011

WCF (part 2)

1 Mô hình lập trình WCF
  1.1 Sử dụng phương pháp hướng đối tượng hay hướng dịch vụ?

  • Nếu các bạn đã học qua môn học về các phương pháp lập trình hẳn sẽ thấy có 2 phương pháp chính là hướng thủ tục và hướng đối tượng. Và phương pháp hướng đối tượng trong thời gian gần đây được phát triển rất mạnh và được hỗ trợ ngay trong các ngôn ngữ lập trình như C# hay VB.NET. Khi làm việc với các dịch vụ web bạn đã làm quen với một phương pháp nữa là lập trình hướng dịch vụ (Service-oriented programming). Microsoft đã cung cấp nhiều công cụ trên .NET Framework để hỗ trợ phương pháp lập trình này thông qua các lớp trong không gian tên: System.Web.Services.
  • Như vậy khi làm việc với WCF bạn có hai lựa chọn là hướng đối tượng và hướng dịch vụ. Vậy ta nên sử dụng phương pháp nào? Câu trả lời là dùng cả hai. Nói một cách đơn giản là phương pháp hướng đối tượng được sử dụng để phát triển các ứng dụng trên desktop, còn phương pháp hướng dịch vụ được sử dụng để kết nối các ứng dụng đó với nhau. Điều quan trọng ở đây là làm sao để hiểu được sự khác nhau giữa hai phương pháp và hiểu được khi nào chúng được sử dụng và sử dụng như thế nào đồng thời cũng phải hiểu về các lợi ích chúng cung cấp.
  • Về hướng đối tượng có thể hiểu như sau. Các ứng dụng hướng đối tượng là hai hay nhiều lớp phụ thuộc lẫn nhau và chia sẻ chung các kiểu dữ liệu. Những lớp này liên lạc với nhau thông qua các lời gọi các hàm mà lớp đối tượng cung cấp.
  • Các ứng dụng hướng dịch vụ là các chương trình không biết gì về nhau. Mỗi ứng dụng liên lạc với ứng dụng khác thông qua các bản tin. Điểm đặc biệt là các bản tin này được gửi từ một ứng dụng sang ứng dụng khác mà không quan tâm tới nền tảng mà dịch vụ đang chạy.
  • Khi phát triển các dịch vụ WCF, điều quan trọng là cần hiểu sự liên kết giữa hướng đối tượng và hướng dịch vụ. Khi làm việc với .NET Framework bạn chắc chắn rất quen thuộc với thuật ngữ lớp (class) và giao diện (interface). Các thuật ngữ này vẫn được sử dụng khi phát triển dịch vụ WCF. Các lớp và giao diện là phần hướng đối tượng trong WCF, còn phần hướng dịch vụ trong WCF sẽ được thấy khi bạn đưa vào các thuộc tính WCF để định nghĩa các thực thể.
Ví dụ, lớp sau đây định nghĩa một giao diện hướng đối tượng
public interface DichVuBanHang
{
decimal TinhGiaVanChuyen(string diachi, decimal trongluong)
{
// thực hiện tính toán
}
decimal TinhTienThue(decimal tongGiaTien)
{
// thực hiện tính toán
}
}


Ta sẽ có phần hướng dịch vụ cho dịch vụ WCF khi thêm vào các thuộc tính cho giao diện ở trên [ServiceContract]
[ServiceContract]
public interface DichVuBanHang
{
[OperationContract]
decimal TinhGiaVanChuyen(string diachi, decimal trongluong)
{
// thực hiện tính toán
}
[OperationContract]
decimal TinhTienThue(decimal tongGiaTien)
{
// thực hiện tính toán
}
}

Như vậy là qua ví dụ trên các bạn có thể thấy mối liên kết giữa phương pháp hướng đối tượng và hướng dịch vụ trong WCF. Các bạn chưa cần quan tâm tới các thuộc tính [ServiceContract] và [OperationContract] vội, bởi vì những thuộc tính này, và còn nhiều thứ khác nữa sẽ được giới thiệu một cách chi tiết khi thích hợp.

  1.2 Service Model (Mô hình dịch vụ):

  • Nếu bạn đã từng làm việc với dịch vụ web, bạn sẽ thấy mô hình này quen thuộc với bạn theo một cách nào đó. Khi bạn tạo một dịch vụ web, bạn thực sự tạo ra một dịch vụ (service). Dịch vụ web chứa một tài liệu XML để mô tả tất cả mọi thứ cần biết về dịch vụ đó. Tài liệu này được mô tả bằng ngôn ngữ Web Service Description Language (ngôn ngữ mô tả dịch vụ web). Nó chứa ba phần:
  • Service (dịch vụ): Chứa thông tin về vị trí của dịch vụ
  • Binding: Chứa thông tin về cách liên lạc với dịch vụ, như dịch vụ sử dụng giao thức gì, vv.
  •  PortType (kiểu cổng): Giải thích về dịch vụ sẽ làm gì
  • Mô hình dịch vụ trên WCF cũng tương tự như với mô hình dịch vụ web. Điểm khác biệt là ở cách đặt tên. Trong WCF các phần không được gọi là service, binding, và portType mà được gọi tương ứng là address (địa chỉ), binding, và contract.
  • Mô hình dịch vụ WCF được cung cấp trong không gian tên System.ServiceModel. Không gian tên này chứa rất nhiều lớp, nhưng bạn hoàn toàn không cần biết toàn bộ chúng. Để sử dụng mô hình và xây dựng dịch vụ, ta thường sử dụng một số lớp sau:
  • BasicHTTPBinding : Là binding mà các điểm cuối dịch vụ có thể sử dụng để liên lạc với các ứng dụng khách và dịch vụ web (ASMX)
  • NetMsmqBinding : Là binding mà các điểm cuối dịch vụ có thể sử dụng để liên lạc với các MSMQ khách và các dịch vụ khác
  • NetNamedPipeBinding : Là binding mà các điểm cuối dịch vụ có thể sử dụng để liên lạc với các ứng dụng khách/dịch vụ trên cùng một máy
  • WSHTTPBinding : Là binding mà các điểm cuối dịch vụ có thể sử dụng để liên lạc với các ứng dụng khách/dịch vụ sử dụng các giao dịch phân tán và các phiên làm việc bảo mật và tin cậy được.
  • EndpointAddress :Lớp biểu diễn địa chỉ duy nhất được cung cấp và truy xuất được cho máy khách để liên lạc với điểm cuối dịch vụ
  • EndpointAddressBuilding : Là phương pháp để tạo mới các địa chỉ đầu cuối với các giá trị tham số xác định
  • ChannelFactory : Là phương pháp trong đó các kiểu kênh khác nhau được tạo ra và quản lý, và đưa tới cho các ứng dụng khách để gửi bản tin tới các điểm cuối
  • Identity : Cách mà một định danh được xác định, cho phép xác thực giữa các điểm cuối khi trao đổi bản tin
  • MessageHeader : Biểu diễn nội dung của một đầu đề bản tin SOAP
  • ServiceHost : Phương pháp cung cấp vật chứa cho các dịch vụ
  • ReliableSession : Cung cấp truy xuất tới các thuộc tính của thành phần binding trong phiên làm việc tin cậy.
Để định nghĩa việc liên lạc của dịch vụ, ta thường hay sử dụng các lớp sau:
  • AddressHeader: Phần đầu đề chưa thông tin địa chỉ được sử dụng để xác định và liên lạc với một điểm cuối
  • AddressHeaderCollection : Một tập hợp các đầu đề địa chỉ
  • Binding : Tập hợp các thành phần binding, mỗi binding định nghĩa cách mà một điểm cuối liên lạc với thế giới bên ngoài
  • BindingContext : Cung cấp địa chỉ và thông tin binding cần thiết cho việc xây dựng kênh
  • BindingElement: Biểu diễn một thành phần binding, được sử dụng để xây dựng các binding
  • CustomBinding :Sử dụng để định nghĩa và xây dựng một tuỳ biến binding từ một tập các thành phần binding
  • Message : Một đơn vị của liên lạc giữa các điểm cuối
  • MessageHeader : Nội dung của đầu đề bản tin SOAP
  • MessageHeaders : Tập hợp các đầu đề bản tin
1.3 Các phương pháp lập trình với WCF:

Có một số phương pháp lập trình với WCF, mỗi phương pháp có ưu điểm và khuyết điểm riêng của nó. Điều đặc biệt về WCF là luôn có hơn một cách để giải quyết một vấn đề trong WCF, và bạn không nhất thiết phải chọn duy nhất một phương pháp nào. Trong thực tế, cách làm tốt nhất là tổ hợp các phương pháp để có được sự linh hoạt và mềm dẻo cho dịch vụ của bạn.
Có ba phương pháp hay được sử dụng khi phát triển dịch vụ WCF như sau:
  • Phương pháp khai báo
  • Phương pháp lập trình trực tiếp
  • Phương pháp sử dụng tập tin cấu hình
1.3.1 Declarative programming (Phương pháp khai báo)
  • Lập trình khai báo đạt được thông qua các thuộc tính. Những thuộc tính này được sử dụng để định nghĩa các contract và xác định hành xử của dịch vụ. Chúng được sử dụng để xác định thêm các tham số để thay đổi các chi tiết của contract và hành xử dịch vụ.
  • Thuộc tính ServiceContract dùng để quy định là giao diện này định nghĩa các chức năng của một dịch vụ. Thuộc tính OperationContract được sử dụng ở các hàm để quy định rằng hàm này được khai báo là một phần của dịch vụ. Đó là tất cả những gì cần để tạo ra một dịch vụ WCF.
  • Thêm nữa, bạn không nhất thiết phải sử dụng các giao diện (interface) khi cài đặt một dịch vụ, điều này cũng giống như việc bạn không cần phải sử dụng giao diện để định nghĩa một lớp. Tuy vậy bạn nhất thiết phải quy định phần nào thuộc về dịch vụ. Bạn có thể định nghĩa những phần khác cần cho giao diện, nhưng chỉ những hàm (phương thức) có gắn thuộc tính [OperationContract].
  • Ví dụ ta có một dịch vụ thực hiện phép tính cộng giữa 2 số nguyên AddInt và 2 số thực AddDouble. Ta khai báo dịch vụ như sau:
[ServiceContract]
public interface ICalcService
{
[OperationContract]
int AddInt(int x, int y);
[OperationContract]
double AddDouble(double x, double y);
}



Như vậy dịch vụ của chúng ta sau khi khai báo sẽ có 2 phương thức (khai báo với thuộc tính OperationContract) là AddInt và AddDouble. Tuy nhiên khi khai báo trong C#, việc đặt tên AddInt và AddDouble, và có thể có một số hàm add cho các kiểu dữ liệu khác, có thể rút gọn lại thành một tên hàm Add mà thôi. Nhưng các dịch vụ lại không cho phép đặt trùng tên hàm như thế. Chúng ta có thể khai báo thêm với thuộc tính OperationContract để thực hiện, cách làm như sau:
[ServiceContract]
public interface ICalcService
{
[OperationContract(Name="AddInt")]
int Add(int x, int y);
[OperationContract(Name="AddDouble")]
double Add(double x, double y);
}
Các bạn có thể thấy là chúng ta sử dụng được phép nạp chồng tên trong C# và sử dụng thêm tham số Name để quy định thêm tên hàm ở dịch vụ. Ngoài ưu điểm trong việc giải quyết nạp chồng tên hàm, ta còn thấy một lợi ích khác nữa là, việc quy định tham số Name trong thuộc tính OperationContract còn cho ta thêm linh hoạt trong việc đổi tên các hàm trong giao diện mà không làm thay đổi định nghĩa dịch vụ, nghĩa là các ứng dụng khác sử dụng dịch vụ này không cần phải biên dịch lại.1.3.2 Explicit programming (Phương pháp lập trình trực tiếp)
Là phương pháp lập trình hướng đối tượng, bạn làm việc trực tiếp với các lớp và giao diện cung cấp bởi mô hình đối tượng của WCF. Làm việc trực tiếp với mô hình đối tượng cho phép nhà phát triển tính linh hoạt cao hơn và khả năng điều khiển tốt hơn thông qua mã nguồn của họ. Thêm nữa nó cho phép điều khiển sâu hơn rất nhiều so với phương pháp khai báo và phương pháp sử dụng tập tin cấu hình.
1.3.3 Phương pháp sử dụng tập tin cấu hình
Cũng giống như phương pháp khai báo, có rất nhiều thứ mà bạn có thể quy định liên quan đến hành xử của một dịch vụ thông qua tập tin cấu hình của dịch vụ. Điều hay trong cách tiếp cận này là những thay đổi ở tập tin cấu hình hoàn toàn không cần phải biên dịch lại dịch vụ mới sử dụng được.
Sau đây là ví dụ sử dụng tập tin cấu hình để định nghĩa dịch vụ tính toán trong ví dụ của phần phương pháp khai báo.
<configuration>
<system.web>
<compilation debug="true" />
</system.web>
<system.serviceModel>
<services>
<service behaviorConfiguration="CalculationService.CalcServiceBehavior"
name="CalculationService.CalcService">
<endpoint address="" binding="wsHttpBinding" contract="CalculationService.ICalcService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8731/CalcService/" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="CalculationService.CalcServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>

theo: http://forum.aspvn.net/

1 nhận xét:

  1. Sample đây
    http://download.microsoft.com/download/4/8/9/4896F014-7E17-4DD9-87E5-3121CF7F4032/WCF_WF_Samples.exe

    Trả lờiXóa