Kết nối một lớp nghiệp vụ và kho lưu trữ bằng cách sử dụng đơn vị mẫu công việc


8

Câu hỏi của tôi tương tự như câu hỏi này về Stack Overflow: Cách chính xác để sử dụng Đơn vị công việc / Kho lưu trữ trong lớp nghiệp vụ là gì?

Kịch bản:

  • Giải pháp .Net
  • Kho lưu trữ được sử dụng để truy xuất các đối tượng từ DB
  • IUnitOfWork được sử dụng để cho phép giao dịch trên nhiều kho lưu trữ

Điều này có ý nghĩa với tôi và tôi đã thực hiện một cái gì đó dọc theo những dòng này hoạt động tốt. Bây giờ tôi muốn giới thiệu một lớp logic kinh doanh và đang gặp khó khăn khi tổ chức ba yếu tố (BLL, UnitOfWork và Kho lưu trữ) trong tâm trí của tôi.

Sự hiểu biết của tôi:

  • Kho lưu trữ - truy xuất dữ liệu, thao tác
  • UnitOfWork - kiên trì
  • BLL - logic liên quan đến doanh nghiệp ('thế giới thực') (không thích thuật ngữ đó!)

Hãy xem xét chúng tôi có một giao diện người dùng ASP.Net MVC.

BLL trông như thế nào và bộ điều khiển MVC sử dụng nó trông như thế nào?

Để tham khảo: Tôi tự hỏi liệu có lẽ việc triển khai IUnitOfWork / IRep repository của tôi có thể là nguyên nhân cơ bản của sự nhầm lẫn của tôi không.

public class IRepository<T> 
{
    private IObjectSet<T> objSet;
    public IRepository<T>(IUnitOfWork uow)
    {
        objSet = uow.CreateObjectSet<T>();
    }

    public IQueryable<T> Add(T entity)
    {
        objSet.Add(entity);
    }
    //etc. etc. for delete, attach, getall
}

Vì vậy, tôi cảm thấy nếu tôi có BLL, tôi nên chuyển nó cho IUnitOfWork, để nó có thể sử dụng nó để tạo các thể hiện IRep repository mà nó cần. Nhưng làm thế nào BLL (tách DLL từ giao diện người dùng) 'biết' triển khai IRep repository để xây dựng?


2
Tôi thực sự nghĩ rằng câu hỏi của bạn là tốt. Vấn đề là, đây là một khu vực mờ; không có One True Way ™ để làm điều đó và không ai muốn đưa ra đề xuất cho bạn vì họ không muốn được nói rằng họ đang làm sai. Cá nhân tôi thích cách tiếp cận trung tâm bảng cơ sở dữ liệu mỏng hơn, mỏng hơn cho các dự án nhỏ hơn; tất cả các buổi lễ này thực sự dành cho các ứng dụng doanh nghiệp quy mô lớn.
Robert Harvey

Điểm công bằng cả và lỗi là sau đó với từ ngữ của tôi. Tôi quan tâm đến ý kiến ​​cá nhân, "đây là cách cá nhân tôi sẽ tiếp cận nó".
glosrob

Câu trả lời:


5

Xin lưu ý rằng tôi chỉ có kinh nghiệm nhỏ với .NET framework và câu trả lời này chỉ liên quan đến phần kiến ​​trúc của câu hỏi của bạn.

Theo như tôi hiểu, về cơ bản, bạn đang áp dụng các mẫu kiến ​​trúc sau trong ứng dụng của mình:

Các lớp: Dường như bạn có một lớp kiên trì (Mẫu lưu trữ), lớp logic nghiệp vụ và lớp xem.

Model-View-Controller: Mẫu này được áp dụng trong lớp khung nhìn bằng ASP.NET MVC.

Tôi đoán câu hỏi là: BLL trông như thế nào và bộ điều khiển MVC sử dụng nó trông như thế nào?

Trước hết, kiến ​​trúc này dành cho các ứng dụng doanh nghiệp quy mô lớn như Robert Harvey đã đề cập trong bình luận của ông cho câu hỏi của bạn. Điều đặc trưng cho các hệ thống như vậy là logic miền (mà bạn gói gọn trong lớp logic nghiệp vụ) phải có thể truy cập được thông qua các giao diện khác nhau.

Ví dụ, hãy xem xét Twitter - Twitter có thể có lớp logic nghiệp vụ cung cấp các dịch vụ để đăng ký và xác thực người dùng, đăng các tweet và nhiều hơn nữa. Trên lớp logic nghiệp vụ này, nhiều thành phần khác có thể tồn tại trong lớp xem, ví dụ: giao diện web và thành phần dịch vụ web. Vì tất cả logic nghiệp vụ được gói gọn trong lớp logic nghiệp vụ, bạn có thể tuân theo nguyên tắc DRY và cải thiện khả năng bảo trì và các thuộc tính chất lượng khác.

Để quay lại câu hỏi của bạn - bạn nên gói gọn logic kinh doanh và truy cập dữ liệu trong BLL. Bộ điều khiển (nghĩ rằng MVC) nên sử dụng BLL và không nên truy cập trực tiếp vào cơ sở dữ liệu. Xem xét lớp xem như một giao diện cho ứng dụng của bạn.

Vì vậy, tôi cảm thấy nếu tôi có BLL, tôi nên chuyển nó cho IUnitOfWork, để nó có thể sử dụng nó để tạo các thể hiện IRep repository mà nó cần. Nhưng làm thế nào BLL (tách DLL từ giao diện người dùng) 'biết' triển khai IRep repository để xây dựng?

BLL nên biết kho lưu trữ nào (nguồn dữ liệu?) Mà nó sử dụng. Các lớp trên không nên kiểm soát điều này. Một lần nữa, hãy xem xét lớp xem chỉ như một giao diện cho logic kinh doanh của bạn.

Nếu bạn không cần chi phí chung của lớp logic nghiệp vụ, bạn cũng có thể chọn sử dụng nó chỉ để truy cập dữ liệu dưới dạng đối tượng truy cập dữ liệu .

Tôi hy vọng điều này đã giúp làm rõ trách nhiệm của các thành phần khác nhau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.