Để tiếp tục loạt bài, tôi muốn xem cách chúng ta có thể kết xuất dữ liệu từ phía server của ứng dụng của bạn.
Các dữ liệu cần thiết của một ứng dụng doanh nghiệp đến từ nhiều nguồn khác nhau. Từ CSDL SQL, từ CSDL Oracle, từ SQL Azure, từ SharePoint, từ một mainframe và thông thường bạn chọn một mô hình dữ liệu như NHibernate, LINQ to SQL, Entity Framework, Stored Proc, một dịch vụ. Mục đích của RIA Service trong bản phát hành lần này là làm cho việc thao tác với dữ liệu dễ dàng với dữ liệu đến từ bất kỳ (hoặc nhiều) nguồn khác nhau từ một ứng dụng Silverlight. Trong loạt bài này sẽ dùng Entity Framework để truy cập vào CSDL SQL Express, nhưng các khái niệm cơ bản của nó có thể áp dụng vào cho bất kỳ nguồn dữ liệu nào.
Thêm DishView.mdf vào thư mục BusinessApplication1.Web\App_Data – tất nhiên trong một ứng dụng thực tế, bạn có thể sẽ cần một chuỗi kết nối để kết nối đến một CSDL sẵn có.
Sau đó thể vào một mô hình Entity Framework.
Như bạn thấy, chúng ta có một tập Entity vô cùng đơn giản, trong đo một Restaurant có nhiều Plate.
Tiếp theo, chúng ta cần viết một số đoạn lệnh xử lý để kiểm soát và tinh giản những dữ liệu có thể thấy được bởi Silverlight client. Để làm điều này, chúng ta thêm vào một DomainService. Một DomainService chỉ đơn giản là một dạng dịch vụ WCF mà nó làm cho việc truy vấn, cập nhật, bảo vệ và kiểm tra dữ liệu trở nên rất dễ dàng. Nhưng nếu bạn đang là một chuyên gia về WCF và biết tất cả mọi thứ về cấu hình WCF, bạn hoàn toàn có thể tùy chỉnh lại dịch vụ theo đúng cách bạn muốn. Tất nhiên, tôi hi vọng 90% trường hợp là không cần làm điều đó.
Tiếp theo, chúng ta có một cơ hội để đưa dữ liệu vào cho DomainService.
Trong trường hợp này, chúng ta sẽ kết xuất lớp Plate và Restaurant, nhưng chỉ có Plate là cho phép cập nhật. Chúng ta cũng tạo ra một lớp chứa thông tin cho việc lưu trữ các thuộc tính được dùng để xác thực, tạo một lớp riêng như vậy giúp tránh không bị mất các lệnh tùy biến bạn viết mỗi khi tạo lại mô hình Entity Framework. Chúng ta tạo ra lớp DishViewDomainService. Tôi đã cập nhật lại các dòng 8-9 với một chút quy tắc xử lý. Hãy cùng xem qua từng dòng…
1: [EnableClientAccess] 2: public class DishViewDomainService : LinqToEntitiesDomainService<DishViewEntities> 3: { 4: 5: public IQueryable<Restaurant> GetRestaurants() 6: { 7: return this.ObjectContext.Restaurants 8: .Where (r=>r.Region != "NC") 9: .OrderBy(r=>r.ID); 10: } 11:Dòng 1: Thuộc tính này chỉ ra DomainService này có thể truy xuất được qua HTTP, nếu không có nó, dịch vụ này chỉ có thể gọi được từ cùng ứng tiến trình. Điều này rất có ích khi dùng trong ASP.NET WebForms\Dynamic Data.
Dòng 2: Tôi cho lớp này thừa kế từ LinqToEntitiesDomainService, đây là một lớp tiện ích cung cấp sẵn một số phương thức trợ giúp cho Entity Framework, lớp này thừa kế lại từ lớp cơ sở DomainService, cũng là lớp mà bạn sẽ thừ kế nếu muốn làm với POCO hay một số trường hợp cần tùy biến cao hơn.
Dòng 5: Để ý là ta trả về một IQueryable của lớp Restaurant. IQueryable là một interface mà LINQ dựa trên đó để làm việc. Điều này cho phép dùng các tính năng truy vấn từ phía client, nhờ vậy bạn có thể làm các thao tác kiểu như săp xếp, phân trang, lọc dữ liệu ngay trên client, bắt buộc nó đáp ứng được các quy tắc xử lý của bạn và thực thi trên tầng dữ liệu. Điều này có nghĩa là không có thêm dữ liệu bị đẩy vào lớp giữa hay client mà bạn không muốn việc xử lý phải dính vào.
Dòng 8-9: Chúng ta có một số quy tắc xử lý để loại ra các Restautant ở North Carolina và thứ tự mặc nhiên trên tập kết quả, và bạn tất nhiên cũng có thể nghĩ ra thêm nhiều quy tắc khác nữa.
Dịch bởi Đào Hải Nam
Thông tin về tác giả bài viết có thể xem tại đây: https://namdh.wordpress.com/2010/04/19/silverlight-4-ria-service-ready-for-business/
Exposing Data có thể dịch là kết xuất dữ liệu.
Đây là cách thức mà tầng service lấy dữ liệu từ sql (dạng datatable, dataset…) và chuyển sang dạng IQueryable, Object… để tầng xử lý có thể dễ dàng sử dụng.
Cảm ơn bạn
anh cho em hỏi muốn kết nối đến csdl MySQL trên localhost từ 1 app WP thì ta phải xử lý như thế nào? Em tìm mãi mà chẳng thấy tài liệu nào nói về vấn đề này.