Về mặt kiến ​​trúc, một lớp trừu tượng hóa cơ sở dữ liệu, chẳng hạn như Entity Framework của Microsoft, có làm mất đi sự cần thiết của Lớp truy cập dữ liệu riêng biệt không?


11

Cách nó đã được

Trong nhiều năm, tôi đã tổ chức các giải pháp phần mềm của mình như sau:

  • Lớp truy cập dữ liệu (DAL) để trừu tượng hóa việc truy cập dữ liệu
  • Lớp logic nghiệp vụ (BLL) để áp dụng quy tắc kinh doanh cho các tập dữ liệu, xử lý xác thực, v.v.
  • Tiện ích (Util) vốn chỉ là một thư viện các phương thức tiện ích phổ biến mà tôi đã xây dựng theo thời gian.
  • Lớp trình bày tất nhiên có thể là web, máy tính để bàn, thiết bị di động, bất cứ điều gì.

Hiện tại là như vậy

Trong khoảng bốn năm qua, tôi đã sử dụng Khung thực thể của Microsoft (tôi chủ yếu là một nhà phát triển .NET) và tôi thấy rằng việc DAL đang trở nên cồng kềnh hơn là vì thực tế là Khung thực thể đã thực hiện công việc mà DAL của tôi đã từng làm: nó trừu tượng hóa việc kinh doanh chạy CRUD dựa trên cơ sở dữ liệu.

Vì vậy, tôi thường kết thúc với một DAL có một tập hợp các phương thức như thế này:

public static IQueryable<SomeObject> GetObjects(){
    var db = new myDatabaseContext();
    return db.SomeObjectTable;
}

Sau đó, trong BLL, phương thức này được sử dụng như sau:

public static List<SomeObject> GetMyObjects(int myId){
    return DAL.GetObjects.Where(ob => op.accountId == myId).ToList();
}

Đây là một ví dụ đơn giản vì BLL thường sẽ áp dụng nhiều dòng logic hơn, nhưng có vẻ hơi quá khi duy trì DAL cho phạm vi hạn chế như vậy.

Sẽ không tốt hơn nếu chỉ từ bỏ DAL và chỉ cần viết các phương thức BLL của tôi như vậy:

public static List<SomeObject> GetMyObjects(int myId){
    var db = new myDatabaseContext();
    return db.SomeObjectTable.Where(ob => op.accountId == myId).ToList();
}

Tôi đang xem xét bỏ DAL khỏi các dự án trong tương lai vì những lý do đã nêu ở trên, nhưng trước khi thực hiện, tôi muốn thăm dò ý kiến ​​cộng đồng ở đây để nhận thức / tầm nhìn xa / ý kiến ​​của bạn trước khi tôi xuống đường trong một dự án và phát hiện ra một vấn đề tôi đã làm ' t dự đoán.

Bất kỳ suy nghĩ đều được đánh giá cao.

Cập nhật

Sự đồng thuận dường như là một DAL riêng biệt là không cần thiết nhưng (tự suy luận ở đây) là một ý tưởng tốt để tránh khóa nhà cung cấp. Ví dụ: nếu tôi có một DAL đang trừu tượng hóa các cuộc gọi EF như minh họa ở trên, nếu tôi bao giờ chuyển sang một số nhà cung cấp khác tôi không cần phải viết lại BLL của tôi. Chỉ những truy vấn cơ bản trong DAL mới cần được viết lại. Phải nói rằng, tôi thấy khó khăn khi hình dung một kịch bản trong đó điều này sẽ xảy ra. Tôi đã có thể tạo một mô hình EF của Oracle db, MSSQL là một mô hình nhất định, tôi khá chắc chắn rằng MySql cũng có thể (??) vì vậy tôi không chắc liệu mã bổ sung có bao giờ cấp ROI đáng giá hay không.


3
Lớp / truy cập dữ liệu của bạn khác với EF như thế nào? Không phải là một lớp truy cập dữ liệu? Chỉ có những lý do tôi có thể thấy để duy trì sự trừu tượng của riêng bạn giữa logic kinh doanh của bạn và EF là để giúp việc kiểm tra dễ dàng hơn và tránh khóa nhà cung cấp.
Marjan Venema

2
Đó là quan điểm của tôi - không có sự khác biệt trong quan điểm của tôi, nhưng tôi đang tìm kiếm các điểm truy cập. Cảm ơn.
Matt Cashatt

3
Cá nhân tôi thấy không có lý do gì để tạo một DAL riêng biệt, vì bản thân EF / NHibernate là các lớp truy cập dữ liệu. Như Marjan đã đề cập, với EF bạn có thể xem xét nếu bạn có thể thấy nhà cung cấp cơ sở dữ liệu thay đổi, trong NHibernate, bạn có thể trao đổi trình điều khiển trong một dòng mã (ngay cả trình điều khiển SQLite để kiểm tra trong bộ nhớ), do đó sẽ là (IMO) mã không cần thiết.
Patryk Ćwiek

3
Không cần phải có hai DAL. Như những người khác đã nêu, hãy giữ BLL của bạn, nhưng hãy cẩn thận để tránh khóa BLL của bạn vào các cấu trúc cụ thể của nhà cung cấp. Tôi luôn muốn thấy mọi thứ đi xuống mức chuỗi hoặc số nguyên. Sau đó, tôi biết rằng tôi có thể dễ dàng hiển thị toàn bộ giao lộ BLL / DAL trên một kênh rất nguyên thủy như dịch vụ web, cổng nối tiếp, liên kết điện báo, chỉ đùa thôi.
Andyz Smith

1
Cập nhật lại: lớp bổ sung này có thể làm cho Unittests của busineslayer dễ dàng hơn nhiều bởi vì chế độ nhạo báng / giả mạo / giả mạo GetMyObjects(int myId)dễ dàng hơn so với chế độ nhạo báng / giả mạo / giả mạo GetObjects.Where(ob => op.accountId == myId).ToList().
k3b

Câu trả lời:


6

Không chắc đây có phải là câu trả lời mà bạn đang tìm kiếm không .. nhưng rồi đây.

Chúng tôi làm điều đó để giữ cho mọi thứ tách biệt / có tổ chức. Có, EF / NHibernate là quyền truy cập dữ liệu .. nhưng chúng tôi giới hạn việc sử dụng nó để lắp ráp riêng với thiết lập kho lưu trữ chung. Tập hợp này cũng chứa tất cả các ánh xạ NHibernate, Nhà máy phiên, mã để xử lý nhiều cơ sở dữ liệu, v.v.

Chúng tôi vẫn gọi nó là "Lớp truy cập dữ liệu", vì toàn bộ tổ hợp tồn tại để hỗ trợ ORM của chúng tôi.

Tôi có lẽ nên lưu ý rằng ứng dụng chính của chúng tôi tham chiếu 5 cơ sở dữ liệu, có khoảng 4-500 đối tượng / ánh xạ tên miền và các lược đồ khác nhau. Vì vậy, thiết lập này có ý nghĩa đối với chúng tôi. Có lẽ đối với một ứng dụng nhỏ hơn, bạn sẽ bỏ qua phần này nhưng .. Tôi là một kẻ hút mã có tổ chức và có lẽ sẽ làm điều đó :)


2

Tôi xem EF và DAL là các thành phần riêng biệt trong hệ thống Doanh nghiệp. Lớp truy cập dữ liệu là một bản tóm tắt mà các dịch vụ khác sử dụng để thực hiện quản lý và lưu trữ dữ liệu. Thông thường, Entity Framework xây dựng một API đẹp mắt xung quanh việc truy vấn, cập nhật, xóa và chèn tuy nhiên ở cốt lõi, chúng vẫn yêu cầu kết nối trực tiếp với nguồn dữ liệu phía sau. Vì vậy, bất kỳ loại định tuyến hoặc tường lửa nào cũng sẽ ngăn EF hoạt động, do đó yêu cầu bạn tạo một thành phần hòa giải EF.

Dưới đây là một ví dụ cấp cao cho thấy DAL và EF phù hợp ở đâu:

-------------    -------                                    ----------------    ------
| Service A | -> | DAL | -> { LOCAL / LAN / WAN ACCESS } -> | DAL BACK-END | -> | EF |
-------------    -------                                    ----------------    ------

Theo kinh nghiệm của tôi, một thiết kế tốt hơn là không bao giờ cho phép logic nghiệp vụ hoặc triển khai dịch vụ truy cập trực tiếp vào lớp EF. Thay vào đó, để cung cấp một sự trừu tượng để làm việc với tất cả các dữ liệu liên tục cho phép bạn gửi yêu cầu qua dây hoặc thực hiện chúng cục bộ.

Thiết kế này giới thiệu một số trừu tượng rò rỉ mặc dù. Vì vậy, nó cần được xem xét trên cơ sở từng trường hợp.

Một số câu hỏi để hỏi:

  • Tất cả các thành phần truy cập dữ liệu của bạn có thể có được Kết nối với kho dữ liệu phía sau không?
  • EF của bạn có cho phép bạn tổng hợp các tập dữ liệu trên các loại lưu trữ dữ liệu khác nhau không? Ví dụ: sử dụng cơ sở dữ liệu SQL với MongoDB cho các tài liệu.

1

Ngày nay, câu hỏi liệu bạn có thay đổi lưu trữ dữ liệu hay không thú vị hơn trước đây, vì câu hỏi có thể không chỉ là liệu bạn có trao đổi giữa MS SQL hay Oracle SQL hay không, mà là câu hỏi lớn hơn về việc bạn có có thể sử dụng trên các dịch vụ lưu trữ dữ liệu NoQuery khác nhau làm kho lưu trữ dữ liệu của bạn.

Nếu có khả năng nghiêm trọng về loại thay đổi đó, việc giữ mã EF của bạn trong DAL của bạn có thể có giá trị để bạn có thể giới thiệu một DAL mới trong tương lai, ánh xạ các yêu cầu kho lưu trữ của bạn tới cơ sở dữ liệu NoQuery. Có thể là một sự thay đổi như vậy sẽ kết thúc bằng việc viết lại BLL của bạn bằng mọi giá vì các giả định liên quan đến db dĩ nhiên xảy ra.

Tương tự, EF trong DAL có thể sẽ khiến việc kiểm tra truy cập dữ liệu cho đơn vị mã BLL của bạn trở nên đơn giản hơn.

Vì vậy, quan điểm của tôi là EF (hoặc ORMS khác) không nhất thiết làm mất nhu cầu về lớp truy cập dữ liệu.

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.