Tạo proxy động cho WCF

Đôi lời về WCF

Bạn nào đã từng làm việc với WCF chăc cũng hiểu việc bất tiện khi cứ thêm method cho cái service là lại hì hục build rồi deploy lại rồi add reference hay generate proxy class thì mới có thể sử dụng được. Rấ mệt và tốn thời gian đúng không :-s

Đặc biệt là đối với các service mà quá nhiều method như cái của công ty mình gần 200 cái mình đã thấy oải lắm rồi. Chính vì vậy mình cũng có tìm hiểu cách làm việc tiện hơn chứ không cứ làm hùng hục như trâu thế chả hiệu quả gì cả.

Sau vài lần lướt mạng thì tìm được cách đó là sử dụng ChannelFactory . Khi sử dụng thằng này thì client sẽ ràng buộc lỏng lẻo (loose couple) với thằng WCF chứ không như trước nữa :3 (kiểu yêu đương nhưng vẫn cho nhau tự do :D).

Nếu trước kia bạn sử dụng cái thằng proxy cho việc giao tiếp giữa thằng client với thằng wcf thông qua việc sử dụng cái thằng WCSDL. Điều này làm cho bạn phụ thuộc vào nó tuy nhiên được cái lợi đó là đẩy hết đống việc khó cho thằng Visual Studio. Thằng Visual sẽ tạo ra cái thằng proxy, khi service thay đổi địa chỉ hay gì đó bạn chỉ cần regenerate lại là được. Điều này làm cho bạn phụ thuộc vào thằng Visual :)) Cái kiểu ăn nhờ ở đợ chắc cũng khó chịu =)) (ai ở rể thì rõ =)))

Còn đối với thằng ChannelFactory thì rất khác vì bạn sẽ được truy cập trực tập vào mấy thằng servicecontract, datacontract. Bạn có thể control mọi thứ mà không cần thông qua thằng Visual Studio wizard. Kiểu tự làm chủ về tài chính 😀

Các bạn nhìn cái bảng dưới để xem nhé

Proxy ChannelFactory
You need service URL and metadata endpoint should be exposed from service side. You have to have direct access to ServiceContracts, DataContracts, MessageContracts.
Simple to use as you get required configuration through proxy. Comparing with Proxy, creatin ChannelFactory is complex as you need to configure
at code level.
You can create WCF service proxy using WSDL or by adding Service Reference in Visual Studio Solution explorer You can create ChannelFactory by adding reference to assembly where required ServiceContract,
DataContract,
MessageContracts resides.
Proxy has below restrications

  1. Properties needs to have getter and setter, you can not have read only or write
    only properties.
  2. You can not expose class constructors.
  3. Only ServiceContract
    can be expose, you can not expose any other method than ServiceContracts OperationContract.
ChannelFactory has below restrictions

  1. It requires direct access to the ServiceContracts, DataContracts and any other dependent
    methods.

Ví dụ

Sourcecode mẫu

https://github.com/hoangnl/WcfDynamicProxy/https://github.com/hoangnl/WcfDynamicProxy/

Các bạn fork về hoặc download thì tùy nhé.

Khi lấy về thì ở đây bạn sẽ có 3 project như hình nhé

Untitled

 

Cái thằng Services thì là cái thằng cuối cùng NorthwindServices nhé. Các servicecontract và datacontract của nó thì được đặt ở cái thằng thứ hai NorthwindContracts. Thằng đầu tiên là thằng Client thì được reference thằng thứ 2 nên nó có thể gọi mấy thằng ServiceContract thoải mái :)) Cấu trúc đại loại nó là như thế.

Các bạn hosting thằng service lên rồi chạy thằng client là được.

Trong thằng client thì có đoạn

public static Category GetCategoryDetails(int categoryID)
{
Category category = new Category();

WSHttpBinding myBinding = new WSHttpBinding();
EndpointAddress myEndpoint = new EndpointAddress(“http://localhost:7741/NorthwindServices/CategoryServices/CategoryService“);
ChannelFactory<ICategoryService> myChannelFactory = new ChannelFactory<ICategoryService>(myBinding, myEndpoint);

ICategoryService instance = myChannelFactory.CreateChannel();

category = instance.GetCategoryDetails(categoryID);

myChannelFactory.Close();

return category;
}

Đoạn này là đoạn thằng ChannelFactory dùng để gọi service thông qua các servicecontract và datacontract đó :3 Bạn chỉ cần khai báo binding rồi Endpoint truyền vào cho nó để thằng ChannelFactory nó hiểu sử dụng 😀

Đến đoạn này thì chắc nhiều bạn cũng nghĩ. Mẹ nếu làm thế này thì lại cứng cái đoạn binding với endpoint trong code à. Thế thì vẫn tùy quá chưa tiện lắm :D. Mình cũng thây vậy nên lại đi tìm tiếp thì có đoạn code để có thể cho thằng ChannelFactory nó đọc trong file config cho dễ.

Untitled

Cái này các bạn xem cái file ServiceFactory để tham khảo nhé 😀

TỔng kết

Ở công ty mình đang dùng cái proxy, chắc tương lai mình phải chuyển qua thằng ChannelFactory thôi chứ không cứ mở code ra ngại vãi 😦 Cảm ơn những điều anh chàng ChannelFactory đã mang lại cho chúng ta :* Đúng chuẩn soái cả :)) Tuy nhiên soái ca nên không dễ gì có được, khá khó nhưng sẽ làm việc tốt hơn anh proxy

Tài liệu tham khảo
http://dotnetmentors.com/wcf/creating-dynamic-proxy-using-wcf-channelfactory.aspx
http://www.c-sharpcorner.com/UploadFile/yusufkaratoprak/dynamically-wcf-usage-in-client/
http://www.codeproject.com/Tips/138388/Dynamic-Generation-of-Client-Proxy-at-Runtime-in

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s