Tiếp tục loạt bài của chúng ta, tôi muốn nói một chút về cách RIA Services có thể được triển khai như một dịch vụ Soap/WSDL. Điều này rất hữu ích nếu bạn muốn cho phép dùng cùng các quy tắc xử lý và truy cập dữ liệu với các client khác Silverlight. Ví dụ một ứng dụng Winforms hoặc WPF và thậm chí là một ứng dụng console. SOAP cũng là một mô hình đặc biệt tốt cho việc tương tác với Java/JEE.
Đầu tiên bạn sẽ phải thêm tham chiếu đến assembly Microsoft.ServiceModel.DomainSerivves.Hosting.EndPoints từ RIA Services toolkit.
Sau đó bạn cần sửa lại phần endpoint của domainServices trong file web.config. Dưới đây tôi sẽ cho thấy cách cấu hình SOAP và OData:
<system.serviceModel><domainServices><endpoints><add name="OData"type="System.ServiceModel.DomainServices.Hosting.ODataEndpointFactory, System.ServiceModel.DomainServices.Hosting.OData, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /><add name="Soap"type="Microsoft.ServiceModel.DomainServices.Hosting.SoapXmlEndpointFactory, Microsoft.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /></endpoints></domainServices>Bay giờ tất cả những gì bạn cần là truy cập vào URL sau từ trình duyệt (hãy chú ý thay thế giá trị cổng cho phù hợp):
http://localhost:21516/BusinessApplication1-web-DishViewDomainService.svc
Dạng của tên sẽ là [namespace]-[typename].svc
Và tôi có được một trang giống như trang debug của WCF service.
Và nếu đi sau hơn nữa, bạn có thể xem cả file WSDL của dịch vụ:
Bạn đã hoàn thành việc cấu hình trên server, giờ hãy xem cách dùng trên client. Để đơn giản, tôi sẽ tạo một ứng dụng console, sau đó nhấn phải vào Project và chọn mục Add Services Reference.
1: var context = new DishViewDomainServiceSoapClient(); 2: var results = context.GetRestaurants(); 3: foreach (var r in results.RootResults) 4: { 5: Console.WriteLine(r.Name); 6: } 7:Câu lệnh truy vấn rất đơn giản. Dòng 1 tạo proxy cho client, dòng 2 thực hiện một lời gọi đồng bộ đến server, sau đó ta có thể lập một vòng lặp đơn giản trên tập kết quả.
Việc cập nhật dữ liệu thú vị hơn một chút… Tôi cần tạo một ChanageSet để lưu vào các thay đổi, trong ví dụ này tôi chỉ cập nhật một giá trị. Tôi cũng cần gửi giá trị gốc lại cho server.
1: var changeSet = new ChangeSetEntry(); 2: var org = new Restaurant(); 3: org.ID = entity.ID; 4: org.Name = entity.Name; 5: entity.Name = "Updated:" + entity.Name; 6: changeSet.Entity = entity; 7: changeSet.OriginalEntity = org; 8: changeSet.Operation = DomainOperation.Update; 9: var updateResults = context.SubmitChanges(new ChangeSetEntry[] { changeSet }); 10:Và bạn có thể xem kết quả chạy chương trình này:
Với phiên bản 1.0, bài viết này mô tả dịch vụ RIA services cho các ứng dụng WPF. Tuy nó chạy được, nhưng rõ ràng vẫn chưa hoàn thiện, các tính năng vẫn chủ yếu hỗ trợ Silverlight. Ví dụ, bạn có thể muốn có đầy đủ các trải nghiệm: DataContext, entities with validation, LINQ queries, change tracking… Khả năng hỗ trợ WPF có trong kế hoạch, nhưng không phải với phiên bản này. Nếu bạn thích cách tiếp cận của RIA Services, bạn có thể cân nhắc DevForce hay CSLA.NET, nó có thể chạy cả trên WPF và Silverlight.
Leave a Reply