2015-03-17 22 views
5

Tôi đã đọc rất nhiều bài đăng của mẫu kho lưu trữ nhưng có một vài vấn đề thực tế mà chúng dường như không giải quyết hoặc giải thích. Đây là những gì tôi hiểu về hai mẫu này:Mẫu đối tượng lưu trữ và truy vấn. Làm thế nào để thực hiện các truy vấn phức tạp

Kho lưu trữ và mẫu truy vấn bổ sung: Đối tượng truy vấn đại diện cho logic nghiệp vụ (WHERE clausules) và mẫu lưu trữ có đối tượng truy vấn (IPredicate) và trả về một chọn nơi dẫn

các kho không nên có logic kinh doanh: Tất cả các logic kinh doanh phải tiếp tục truy vấn các đối tượng

Hiện nay tôi có một lớp bao bọc từng đối tượng logic (mà hầu như luôn luôn là một đối tượng thực thể đơn lẻ) triển khai nhiều "Nhận" các phương thức thực hiện các truy vấn phức tạp nhất (join, groupBy, etc ...), đây không phải là một mô hình tốt vì các lớp có xu hướng phát triển rất nhiều vì mã boilerplate cho các truy vấn tương tự và các phương thức công khai của nó phụ thuộc vào ngữ cảnh mà lớp này sẽ được sử dụng, do đó, làm cho các lớp này không thể sử dụng được cho nhiều dự án phụ thuộc vào cùng một cơ sở dữ liệu, đó là mục tiêu chính của tôi cho việc tái cấu trúc dự án này.

Cách truy vấn phức tạp hơn một SELECT đơn lẻ được triển khai với hai mẫu này mà không làm rò rỉ logic nghiệp vụ vào kho lưu trữ?

Hoặc nếu logic nghiệp vụ này không phù hợp với kho lưu trữ hoặc đối tượng truy vấn thì logic này phù hợp ở đâu?

Cảm ơn

+0

Cảm ơn, đây không phải là ngôn ngữ đầu tiên của tôi, tôi sẽ sửa câu hỏi – rafael

Trả lời

3

Có một vài triển khai các mẫu kho lưu trữ và đơn vị công việc bay lượn trên internet. Một số người trong số họ khá đơn giản, nơi nhà phát triển thực hiện cơ bản của riêng mình cho mỗi bảng theo cách thủ công, một số là chung nhưng không nâng cao, và một số thực sự tuyệt vời, chung chung và vẫn cung cấp cho bạn khả năng thực hiện phong nha, chiếu và tương tự.

Một ví dụ về một trong việc thực hiện tốt quan điểm của tôi có thể được tìm thấy ở đây:

https://genericunitofworkandrepositories.codeplex.com/

Nó được nhắm mục tiêu MVC, mà được thể hiện bằng giao diện. Tôi tập trung vào các ứng dụng WPF vì vậy tôi cần điều chỉnh nó một chút. Nhưng ý tưởng của đơn vị thực hiện công việc này khá tốt.

Có phần phụ thuộc vào việc triển khai này. Bởi vì nó dựa vào một số chức năng LINQ và EF nâng cao, người ta có thể cho rằng lớp truy cập cơ bản của bạn đang lây nhiễm lớp kho lưu trữ và các lớp bằng cách sử dụng các kho lưu trữ.

Điểm chính là khi bạn muốn di chuyển ra khỏi EF, rất có thể bạn sẽ phải thay đổi giao diện của các kho lưu trữ của mình.

Để thấy sức mạnh của thư viện này một số đoạn mã để chứng minh điều này:

_fotoRepository = unitOfWork.RepositoryAsync<Foto>(); 
var fotos = await _fotoRepository 
      .Query(r => r.BestelBonId == bestelBonId || werkstukids.Contains(r.WerkstukMetBewerkingenId.Value)) 
      .SelectAsync() 
      .ConfigureAwait(false); 

hoặc sử dụng chiếu:

IRepository<Relatie> relatieRepository = unitOfWork.RepositoryAsync<Relatie>(); 
     var relatiesOverviewsEnumerable = relatieRepository 
      .Query() 
      .NoTracking() 
      .OrderBy(q => q.OrderBy(d => d.RelatieId)) 
      .Select(b => new RelatieOverview 
      { 
       RelatieId = b.RelatieId, 
       Naam = b.Naam, 
       BTW = b.BTW, 
       HoofdAdres = b.Adressen.FirstOrDefault(a => a.AdresTypeId == HoofdadresType) 
      }); 
     _relatieOverviews = new ObservableCollection<RelatieOverview>(relatiesOverviewsEnumerable); 
+0

Làm thế nào để unitOfWork objet liên quan đến giao diện IUnitOfWork được hiển thị ở đây: [link] (https://msdn.microsoft.com/en-us/magazine/dd882510.aspx)?, Như tôi đã hiểu, đơn vị công việc được sử dụng để thay đổi dữ liệu, do đó các phương thức MakeDirty, MakeNew và MakeDeleted, trong khi mẫu Repository được sử dụng để lấy dữ liệu IQueryables từ cơ sở dữ liệu – rafael

+0

có, đó là một bản tóm tắt tốt. –

3

Các Repository mô hình hoạt động tốt cho các ứng dụng CRUD tiêu chuẩn. Nơi bạn cần triển khai bộ tạo, đọc, cập nhật và xóa các hoạt động kinh điển đối với một bảng trong cơ sở dữ liệu. Trong trường hợp đó, bạn tạo một kho lưu trữ cho mỗi bảng và cho phép hoạt động đọc có các giá trị phụ để lọc có thể được áp dụng.

Ở cấp tiếp theo, bạn có mẫu Đơn vị công việc. Chúng được sử dụng để mở rộng nhiều kho lưu trữ và thực hiện các hoạt động kinh doanh. Vì vậy, ví dụ, bạn sẽ đọc các giá trị từ nhiều kho lưu trữ, thực hiện các phép tính và sau đó ghi lại các thay đổi đối với nhiều kho lưu trữ. Tất cả điều đó sẽ xảy ra bên trong một giao dịch để bạn luôn có trạng thái nhất quán trong cơ sở dữ liệu.

Vấn đề là khi bạn có các truy vấn phức tạp trải dài trên nhiều bảng. Trong trường hợp đó, bạn sẽ đặt truy vấn vào kho lưu trữ là bảng đầu tiên trong truy vấn từ mệnh đề. Sau đó, bạn sẽ cần phải cung cấp các tham số cho phương thức lưu trữ đó để nó có thể được tham số hóa khi cần thiết.

+0

Vì vậy, đơn vị của mô hình công việc được sử dụng trong phương thức trên nhiều lớp mà cần phải làm logic kinh doanh? – rafael

+0

Bạn có biết những gì đã làm việc thực sự tốt trong nhiều thập kỷ tại cơ sở dữ liệu truy vấn? SQL. Hãy gọi cho tôi đã bị giật, nhưng những mẫu Kho lưu trữ và Đơn vị công việc này dường như được cấu trúc quá mức và thiếu lợi ích – Manachi

+0

Kho lưu trữ sẽ chứa SQL thực tế. Đơn vị công việc chứa logic giao dịch xung quanh những gì sẽ được nhiều lệnh SQL từ kho. Tôi đồng ý rằng nếu bạn không bao giờ cần phải lo lắng về việc di chuyển sang một cơ sở dữ liệu phụ trợ khác thì bạn thường không cần các mẫu này. –

Các vấn đề liên quan