2009-04-28 27 views
16

Tôi quan tâm đến cảm nhận "thực hành tốt nhất", luyện tập với một liều thực tế nhỏ ở đây.Bạn có cho phép Cấp Web truy cập trực tiếp vào DAL không?

Trong ứng dụng web, bạn có cho phép cấp web của bạn truy cập trực tiếp vào DAL hay nó sẽ đi qua BLL trước?

Tôi đang nói cụ thể về các trường hợp không có "logic nghiệp vụ" thực sự liên quan - chẳng hạn như truy vấn đơn giản: "Tìm nạp tất cả khách hàng có họ của 'Atwood'". Các trường hợp có bất kỳ loại logic nào hoàn toàn sẽ đi qua BLL, vì vậy hãy gọi số moo.

Trong khi bạn có thể đóng gói phương thức này bên trong đối tượng BLL, có vẻ hơi vô nghĩa khi chữ ký sẽ giống hệt chữ ký của đối tượng DLL và mã có thể đơn giản như ủy nhiệm một lớp truy vấn đến DLL.

Nếu bạn chọn tên cũ - sử dụng đối tượng BLL - bạn gọi những đối tượng này là gì? (Giả sử họ làm ít hơn cung cấp một lớp truy vấn vào DLL). Người giúp đỡ? QueryProviders?

Suy nghĩ vui lòng.

Trân

Marty

+0

Chồi câu hỏi tuyệt vời! –

Trả lời

4

Theo tôi, bạn nên LUÔN sử dụng một BLL (Business Logic Layer) giữa tầng web của bạn và Dal của bạn (Data Access Layer).

tôi đánh giá cao cho một số chi tiết truy vấn "đơn giản", BLL sẽ bắt chước chặt chẽ việc Dal (ví dụ Fetch tất cả các nước, Fetch tất cả các loại sản phẩm vv), nhưng để trung thực, ngay cả trong ví dụ của bạn:

(Fetch tất cả khách hàng với họ là của 'Atwood')

có "logic kinh doanh" được bày tỏ ở đây - Một mong muốn cho các hồ sơ dữ liệu được lọc bởi họ, nếu không có gì khác! Bằng cách thực hiện BLL từ khi bắt đầu dự án, nó trở nên vô cùng dễ dàng để chèn hoặc xác nhận hoặc bổ sung "logic" và khi nhu cầu có thể phát sinh (và nếu dự án của bạn là một ứng dụng thương mại, nhu cầu đó sẽ gần như chắc chắn phát sinh sau cùng nếu nó không có ở đầu dự án). Thêm trong logic bổ sung như:

Fetch tất cả các khách hàng đã dành hơn $ 10000 năm nay

hoặc

Không cho phép khách hàng với cái tên là 'Atwood' để mua các sản phẩm trên $ 1000

trở nên dễ dàng hơn đáng kể khi có BLL thực sự tham gia, thay vì cố gắng thu hẹp logic này vào cấp web.

Lưu ý rằng với các loại truy vấn ở trên, chúng tôi gần như chắc chắn nói về nhiều thực thể và bảng cơ sở dữ liệu sẽ phải tham gia cùng với các mối quan hệ được xác định cụ thể để thực hiện chức năng này. Cố gắng để đạt được điều này bằng cách trực tiếp thao tác DAL trở nên lộn xộn vì bạn sẽ xử lý nhiều thực thể và các lớp. Một BLL ở đây sẽ đơn giản hóa rất nhiều mã tầng web của bạn, vì BLL sẽ encapsulate các mối quan hệ thực thể đó đằng sau một giao diện được đơn giản hóa rất nhiều.

Điều này "separation of concerns" trở nên ngày càng quan trọng khi nào và nếu nhu cầu thay đổi giao diện người dùng phát sinh. Trong ít nhất hai lần khác nhau, tôi đã làm việc trên các ứng dụng web thương mại với giao diện người dùng trang web và cuối cùng đã được yêu cầu (do nhu cầu kinh doanh phát sinh từ khách hàng tìm kiếm tích hợp lớn hơn trong các sản phẩm phần mềm của họ) để sản xuất giao diện web service cung cấp chức năng giống hệt như trang web.

Tôi đã nhúng bất kỳ logic nghiệp vụ nào trong cấp web của mình, tôi sẽ phải sao chép và viết lại logic đó khi triển khai dịch vụ web của mình. Vì vậy, tôi đảm bảo rằng tất cả logic nghiệp vụ được gói gọn trong các lớp BLL, điều này có nghĩa là tôi chỉ cần thiết kế một loạt các cuộc gọi phương thức giao diện dịch vụ web và cắm các cuộc gọi này lên các phương thức trên các lớp BLL (Facade Design Pattern ở những nơi để đơn giản hóa API dịch vụ web).

Trong tất cả, tôi có thể nghĩ không có lý do gì để NOT bao gồm lớp BLL giữa DAL và cấp web của tôi. Khi nó dễ dàng nhất, khi BLL gần giống "bắt chước" DAL, có, có vẻ như là một bản sao của mã và chức năng, tuy nhiên, trong khi gõ nhiều hơn một chút, điều này cũng làm cho nó tương đối dễ thực hiện.

Khi nó liên quan nhiều hơn (như khi logic kinh doanh quan trọng tồn tại ngay từ đầu), việc tách mối quan tâm giúp giảm sự lặp lại (nguyên tắc DRY) đồng thời đơn giản hóa việc bảo trì trong tương lai và liên tục.

Tất nhiên, điều này giả định bạn đang làm tất cả điều này "bằng tay". Nếu bạn mong muốn, bạn có thể đơn giản hóa đáng kể các lớp DAL/BLL/UI bằng cách sử dụng một số ORM trong đó có rất nhiều! (ví dụ: LINQ-to-SQL/Entities, SubSonic, NHibernate v.v.)

+1

Tôi nghĩ rằng ví dụ về sau này thêm một dịch vụ web trên BLL là một ví dụ đủ hấp dẫn. Cảm ơn! –

+0

Mặc dù, tôi rất tò mò về nhận xét của bạn về ORM. Tôi đang sử dụng Hibernate trong dự án của tôi, mà làm cho DAL của tôi khá gầy, nhưng vẫn có ranh giới rõ ràng giữa các lớp. Đây có phải là quan điểm của bạn hay bạn có xem xét cơ hội kết hợp BLL & DAL khi sử dụng ORM không? –

+0

@Marty - Bạn có thể sử dụng một số ORM nâng cao để tự động hóa DAL và phần lớn BLL, tuy nhiên, nếu tôi sử dụng ORM, tôi sẽ tự động tạo DAL của tôi và tự viết BLL. Bằng cách này, nó tiết kiệm cho tôi một công việc bằng tay bằng văn bản DAL và hãy để tôi tập trung vào BLL. – CraigTP

1

Ngay cả khi đó là ngày; y một dòng trong BLL thực hiện cuộc gọi tương tự như các DLL, trừu tượng cho phép bạn thêm logic kinh doanh trong lớp đó mà không cần phải ảnh hưởng đến bất kỳ lớp nào khác. Nó có thể không giống như thế này là có khả năng bây giờ, nhưng bất cứ ai có để hỗ trợ các ứng dụng sau khi bạn sẽ cảm ơn bạn đã sử dụng các mẫu như thế này khi thay đổi đi về.

Để đặt tên, tôi có đối tượng lõi, nói NameChange, sau đó tôi sẽ có đối tượng BLL là đối tượng thay đổi tên, sau đó tôi sẽ có đối tượng DAL/Entity được gọi là Person. Đối tượng Person nghiệp vụ nằm trong vùng tên BLL, và đối tượng DAL/Entity Person nằm trong không gian tên DB (tôi đã chọn DAL nếu tôi đã tạo nó ban đầu).

2

Bạn cần phải phân biệt các đối tượng BLL (dù đây là những cái quái gì vậy? Miền đối tượng bất kỳ ai?) Và Dịch vụ. Đối tượng miền của bạn sẽ không có gì để làm với lớp truy cập dữ liệu của bạn. Theo như tầng web đi, nó có thể điều trị kho của bạn (nghĩ rằng IRepository) giống như bất kỳ dịch vụ khác mà nó có thể tự do sử dụng. Vì vậy, dòng dưới cùng là: có, tầng web có thể sử dụng DAL trực tiếp cung cấp nó là tài sản đóng gói và được thể hiện như một dịch vụ lớp dịch vụ tiêu chuẩn.

+0

BLL - Lớp logic nghiệp vụ? –

+0

Vâng - BLL == Lớp logic nghiệp vụ. Tôi xem chúng như tách biệt (mặc dù phần mở rộng tự nhiên của) mô hình miền. Nếu đây là một cái nhìn gây tranh cãi, có lẽ tôi sẽ mở một câu hỏi mới để có được một số ý kiến. –

+1

Tôi biết BLL là viết tắt của cái gì. Tôi không thể đồng ý với sự kết hợp "Kinh doanh Logic" và "Đối tượng" vì tôi tin tưởng mạnh mẽ rằng các đối tượng kinh doanh nên không có bất kỳ logic nào và logic nên được chuyển đến một lớp dịch vụ. –

1

Chúng tôi gọi lớp này là Lớp điều khiển [lớp] đóng gói DAL từ cấp web. Lớp điều khiển có thể có hoặc không có bất kỳ logic nghiệp vụ nào, nó giúp tách biệt DAL khỏi lớp trình bày và giữ chúng độc lập [ở một mức độ nào đó].

+0

Không phải là bộ phận điều khiển của Web Tier? – svirk

0

Chúng tôi có xu hướng sử dụng facade pattern để truy cập, mặc dù dự án của chúng tôi mà chúng tôi sử dụng nó khá lớn, tôi nghĩ rằng nó có thể chứng minh quá mức cần thiết cho một dự án nhỏ hơn.

Về cơ bản:

UI -> BusFacade -> BusinessLogic -> DalFacade -> DataAccessLayer

mặt tiền làm cho một cách tiếp cận thoải mái/sạch từ UI, và buộc bạn phải chuẩn hóa trên quy ước đặt tên của bạn như điểm duy nhất của mục có một số phương pháp.

BusFacade.GetCmsSiteMap() 
BusFacade.GetProductGroup() 

etc.etc.

+0

Và trong một số trường hợp, bạn có truy cập trực tiếp BusFacade -> DalFacade không? –

+0

không bao giờ thực hiện không - thậm chí (như poster trước được đề xuất) nếu nó chỉ là một bước đi qua lớp kinh doanh, tôi vẫn đặt cuộc gọi để đảm bảo rằng cần phải thay đổi trong tương lai, ở đó. –

33

Tôi không đồng ý với hầu hết các bài đăng ở đây.

Tôi gọi lớp dữ liệu của mình trong tầng web. Nếu không có gì ở giữa tầng WEB/UI thì không có điểm nào tạo ra một lớp "chỉ trong trường hợp". Đó là tối ưu hóa trước. Đó là một sự lãng phí. Tôi không thể nhớ lại một lần lớp kinh doanh "đã cứu tôi". Tất cả nó đã được tạo ra nhiều công việc, nhân bản và bảo trì cao hơn. Tôi đã dành nhiều năm đăng ký lớp kinh doanh -> Lớp dữ liệu truyền thực thể giữa các lớp. Tôi luôn cảm thấy bẩn thỉu khi tạo ra những phương pháp không làm gì cả.

Sau khi được giới thiệu đến Domain Driven Design by Eric Evans, tôi thực hiện điều có ý nghĩa. Nếu không có gì ở giữa UI và Lớp dữ liệu thì tôi gọi Lớp dữ liệu trong giao diện người dùng.

Để cho phép các thay đổi trong tương lai, tôi bao bọc tất cả các lớp Lớp dữ liệu của mình trong giao diện. Trong giao diện người dùng, tôi tham khảo các giao diện và tôi sử dụng tiêm phụ thuộc để quản lý việc triển khai. Sau khi thực hiện những thay đổi này, nó giống như một hơi thở của không khí trong lành. Nếu tôi cần phải tiêm thứ gì đó giữa lớp dữ liệu và giao diện người dùng, tôi tạo một dịch vụ.

Một điều khác tôi đã làm là giảm số lượng dự án. Trước khi tôi có một dự án cho Lớp dữ liệu, Logic nghiệp vụ, Thực thể kinh doanh và một số loại dự án giao diện người dùng - thật là một nỗi đau.

Tôi có hai dự án: Dự án cốt lõi (thực thể, logic nghiệp vụ và lớp dữ liệu) và các dự án giao diện người dùng (web, dịch vụ web, v.v ...))

Để biết thêm thông tin tôi khuyên bạn nên nhìn vào những kẻ:

+1

Điểm thú vị (và giải phóng kỳ lạ). Tối ưu hóa sớm là hoàn toàn chống nhanh nhẹn. Tôi nên biết sẽ có các đối số hấp dẫn ở cả hai bên của hàng rào ... bây giờ tôi phải tự quyết định! :) –

+1

Tôi cũng đang làm 'quá nhiều dự án' và gần đây nghĩ "tại sao tôi lại làm cái này?" việc thêm tham chiếu có thể là số tiền hợp lý trên đôi khi +1 –

+1

@Marty - Lưu ý rằng trong khi Chuck và tôi đang sử dụng các cách tiếp cận khác nhau, chúng tôi đều hướng tới cùng một mục tiêu, đáng chú ý là "tách biệt mối quan tâm" và khả năng (tương đối) dễ dàng mở rộng ứng dụng khi cần thiết. Việc sử dụng phép tiêm phụ thuộc của Chuck và lập trình cho một giao diện đạt được điều này giống như việc tôi sử dụng một lớp BLL. – CraigTP

0

Trong khi nó sẽ có thể đi trực tiếp từ lớp Presentation để Dal, bạn đang bỏ qua BLL thường yêu cầu xác thực ...

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