Làm thế nào là thiết yếu để làm cho một lớp dịch vụ?


68

Tôi bắt đầu xây dựng một ứng dụng gồm 3 lớp (DAL, BL, UI) [nó chủ yếu xử lý CRM, một số báo cáo bán hàng và hàng tồn kho].

Một đồng nghiệp nói với tôi rằng tôi phải chuyển sang mẫu lớp dịch vụ, rằng các nhà phát triển đã đến với mẫu dịch vụ từ kinh nghiệm của họ và đó là cách tiếp cận tốt hơn để thiết kế hầu hết các ứng dụng. Ông nói rằng sẽ dễ dàng hơn nhiều để duy trì ứng dụng trong tương lai theo cách đó.

Cá nhân, tôi có cảm giác rằng nó chỉ khiến mọi thứ trở nên phức tạp hơn và tôi không thể thấy được nhiều lợi ích từ nó sẽ chứng minh điều đó.

Ứng dụng này có thêm một phần nhỏ ui sử dụng một số (nhưng chỉ một vài) chức năng của ứng dụng máy tính để bàn nên tôi đã thấy mình sao chép một số mã (nhưng không nhiều). Chỉ vì một số sao chép mã, tôi sẽ không chuyển đổi nó thành định hướng dịch vụ, nhưng anh ấy nói tôi nên sử dụng nó vì dù sao nó là một kiến ​​trúc rất tốt, tại sao các lập trình viên lại rất đam mê dịch vụ ??

Tôi đã cố gắng google trên đó nhưng tôi vẫn bối rối và không thể quyết định phải làm gì.

Câu trả lời:


58

Cuốn sách "Các mô hình kiến ​​trúc doanh nghiệp" của Martin Fowler nói:

Câu hỏi dễ trả lời hơn có lẽ là khi không sử dụng nó. Bạn có thể không cần Lớp dịch vụ nếu logic nghiệp vụ của ứng dụng của bạn sẽ chỉ có một loại khách hàng - giả sử, giao diện người dùng - và đó là phản hồi trường hợp sử dụng không liên quan đến nhiều tài nguyên giao dịch. [...]

Nhưng ngay khi bạn hình dung ra một loại khách hàng thứ hai hoặc tài nguyên giao dịch thứ hai trong các phản ứng trong trường hợp sử dụng, nó sẽ trả tiền để thiết kế trong Lớp dịch vụ ngay từ đầu.

Lợi ích mà Lớp dịch vụ cung cấp là nó xác định một tập hợp các hoạt động ứng dụng phổ biến có sẵn cho các máy khách khác nhau và điều phối phản hồi trong mỗi hoạt động. Khi bạn có một ứng dụng có nhiều loại khách hàng sử dụng logic kinh doanh của nó và có các trường hợp sử dụng phức tạp liên quan đến nhiều tài nguyên giao dịch - sẽ rất hợp lý khi bao gồm Lớp dịch vụ với các giao dịch được quản lý.

Với CRM, Bán hàng và Hàng tồn kho sẽ có rất nhiều trường hợp sử dụng kiểu CRUD trong đó hầu như luôn luôn có sự tương ứng một-một với các hoạt động của Lớp dịch vụ. Các phản hồi về việc tạo, cập nhật hoặc xóa đối tượng miền cần được phối hợp và giao dịch nguyên tử bằng các hoạt động của Lớp dịch vụ.

Một lợi ích khác của việc có Lớp dịch vụ là nó có thể được thiết kế cho lệnh gọi cục bộ hoặc từ xa hoặc cả hai - và cho phép bạn linh hoạt để làm điều đó. Mẫu này đặt nền tảng cho việc triển khai đóng gói logic nghiệp vụ của ứng dụng và gọi logic đó bởi các khách hàng khác nhau một cách nhất quán. Điều này có nghĩa là bạn cũng giảm / loại bỏ mã trùng lặp, vì khách hàng của bạn chia sẻ cùng các dịch vụ phổ biến. Bạn cũng có khả năng giảm chi phí bảo trì - vì khi logic kinh doanh của bạn thay đổi, bạn (nói chung) chỉ cần thay đổi dịch vụ chứ không phải mỗi khách hàng.

Tóm lại, thật tốt khi sử dụng Lớp dịch vụ - hơn nữa tôi nghĩ trong ví dụ của bạn, bạn đã cung cấp vì có vẻ như bạn có nhiều khách hàng logic kinh doanh.


2
Thật thú vị, Martin Fowler ủng hộ cùng một giao diện cho việc gọi từ xa và cục bộ, cho rằng sự khác biệt hiệu năng rất lớn trong việc gọi từ xa buộc một giao diện chi tiết thô hơn.
psr

Tôi hoàn toàn không hiểu đoạn văn của bạn With CRM, Sales and Inventory there will be a lot of CRUD-type use cases of which there is almost always a one-to-one correspondence with Service Layer operations- nếu đó là tất cả về nhiều UI, vậy làm thế nào để CRUD vào đây? Và nếu tôi không cần nhiều UI mặc dù CRUD phù hợp với các dịch vụ, tôi vẫn không tạo lớp dịch vụ, nếu tôi hiểu chính xác và tôi thực sự hy vọng tôi đã làm vì tôi thích giữ mọi thứ đơn giản (lớp dịch vụ là một gây rối cho ý kiến ​​thiếu kinh nghiệm của tôi)
BornToCode

4
Trong những trường hợp đó, hiếm khi chỉ có một khách hàng có thể tận dụng lợi thế của nó. Nếu bạn chỉ có một UI tôi có thể nghĩ ra hai lý do mà bạn vẫn có thể muốn lớp dịch vụ: bảo mật và tái sử dụng. Một thiết lập doanh nghiệp thông thường sẽ có sẵn ứng dụng UI cho các máy khách bên ngoài và lớp dịch vụ của bạn chỉ khả dụng trong mạng. Vì vậy, máy chủ web sẽ phân chia công việc thành một phần bị khóa trong mạng của bạn. Trong ví dụ bán hàng, bạn có thể sử dụng lại nếu bạn lấy doanh số từ trang web của mình và mở rộng sang eBay hoặc Amazon. Bây giờ bạn có một giao diện người dùng, nhưng nhiều khách hàng.
Phil Patterson

5
Chỉ cần thêm vào nhận xét từ @PhilPatterson. Nhiều khách hàng không cần phải dựa trên giao diện người dùng. Hãy nghĩ rằng các dịch vụ web hoặc thư viện - họ cũng có thể là khách hàng. Giao diện người dùng của bạn có thể sử dụng lớp dịch vụ cũng như các dịch vụ phần mềm bạn đóng gói và cho phép người khác sử dụng.
Deco

bạn có thể cung cấp một ví dụ về Lớp dịch vụ không?
dùng962206

34

Thêm một lớp dịch vụ bởi vì bạn đã đánh giá ý tưởng và kết luận cách tiếp cận tốt nhất của nó: tốt

Thêm một lớp dịch vụ vì đó là điều mà tất cả những đứa trẻ tuyệt vời đang làm: xấu

Nếu ruột của bạn nói rằng bạn không cần một cái, thì đừng tạo ra nó.

Một trong những phát triển đáng thất vọng hơn trong thế giới lập trình trong hơn 10 năm qua là nó đã trở thành định hướng "thời trang" khó chịu, với những người theo xu hướng và băng đô như thể chúng là giày mùa này. Đừng rơi vào cái bẫy đó. Bởi vì mùa tới 'mọi người' sẽ nói với bạn rằng bạn nên thiết kế nó theo một cách khác.

Không có gì sai hoặc đúng với một lớp dịch vụ - đó là một cách tiếp cận cụ thể mà sự phù hợp của nó cần được đánh giá dựa trên giá trị kỹ thuật của nó cho dự án. Đừng cảm thấy bắt buộc phải thay thế ý kiến ​​của người khác cho phán đoán của riêng bạn.


27
Điều này hoàn toàn không đề cập đến vấn đề, nó chỉ đưa ra một tuyên bố / tuyên bố về thực tiễn phát triển, sau khi thay thế một vài từ, có thể áp dụng cho bất kỳ câu hỏi nào trên trang web này. Từ việc đọc câu trả lời này, tôi thậm chí không tin rằng bạn biết chính xác lớp dịch vụ là gì .
Aaronaught

12
Nó chắc chắn có thể được áp dụng cho các câu hỏi khác ... không làm cho nó ít đúng hơn. Thực tế là cả bạn và tôi đều không có bất kỳ nơi nào gần bối cảnh cần thiết để nói rõ những gì anh ấy cần trong dự án của mình, vì vậy nói với anh ấy rằng anh ấy cần nó, hoặc không anh ấy không, chỉ là một phỏng đoán thẳng thắn và không chuyên nghiệp. Những gì OP cần ở đây là một chút hỗ trợ về mặt đạo đức để đưa ra những quyết định mà anh ấy biết là đúng đắn.
GrandmasterB

5
@Aaronaught Bất kể tính chính xác của câu trả lời, về cơ bản, anh ta vẫn trả lời câu hỏi chính, "Lớp dịch vụ cần thiết như thế nào?". Ông tuyên bố không cần thiết chút nào và đó có thể chỉ là một mốt nhất thời. Nếu bạn không đồng ý với câu trả lời thì xin vui lòng downvote.
maple_shaft

2
@GrandmasterB Tôi cho rằng thời trang là tốt trong phát triển phần mềm. Hầu hết các nhà phát triển quá mới mẻ hoặc quá bất tài để đưa ra quyết định thiết kế và kiến ​​trúc sáng suốt. Mặc dù vậy, chúng tôi vẫn hy vọng họ sẽ tạo ra một số phần mềm hoạt động, vì vậy họ nhảy vào một nhóm nhạc và phù hợp với lựa chọn thiết kế kém là điều tốt hơn nhiều và có thể duy trì hơn so với cách mà mọi thứ đã được thực hiện cách đây nhiều năm không hiểu hoặc đánh giá cao.
maple_shaft

10
@maple_shaft Chỉ cần làm rõ, tôi không nói Lớp dịch vụ là mốt nhất thời. Tôi đang nói, dựa trên cách đặt câu hỏi, có vẻ như hành vi điên rồ / thời trang / băng đảng của các đồng nghiệp đã đẩy anh ta vào việc sử dụng một kiến ​​trúc mà anh ta không nghĩ là được bảo đảm trong dự án của mình. Tôi nói rõ trong câu trả lời của mình, tôi xem Lớp dịch vụ (hoặc bất kỳ khái niệm nào khác) giống như vậy - các khái niệm trung lập có sự phù hợp nên được đánh giá theo giá trị riêng của chúng cho các dự án riêng lẻ. Chúng không nên được áp dụng / sử dụng khi phán đoán của chính mình nói rằng chúng không cần thiết.
GrandmasterB

22

Có nhiều yếu tố đi vào quyết định tạo ra một lớp dịch vụ. Tôi đã tạo các lớp dịch vụ trong quá khứ vì những lý do sau.

  1. Mã cần được sử dụng lại bởi nhiều khách hàng.
  2. Thư viện bên thứ ba mà chúng tôi có giấy phép hạn chế.
  3. Các bên thứ ba cần một điểm tích hợp vào hệ thống của chúng tôi.
  4. Tập trung logic kinh doanh trùng lặp.

Trường hợp 1: Bạn đang tạo chức năng cơ bản cần được sử dụng bởi vô số khách hàng khác nhau. Lớp dịch vụ tích hợp chức năng cho các khách hàng khác nhau để khai thác chức năng được cung cấp của bạn ngay lập tức.

Trường hợp 2: Bạn thường lưu trữ mã trong không gian ứng dụng nhưng bạn đang sử dụng thư viện của bên thứ ba mà bạn có giấy phép hạn chế. Trong trường hợp này, bạn có một tài nguyên bạn muốn sử dụng ở mọi nơi, nhưng chỉ có một số lượng hạn chế. Nếu bạn lưu trữ nó phía sau một dịch vụ thì toàn bộ tổ chức của bạn có thể sử dụng dịch vụ đó từ các ứng dụng của họ mà không phải mua giấy phép cho mỗi lưu trữ riêng lẻ.

Trường hợp 3: Bạn đang xây dựng chức năng cho bên thứ ba liên lạc với bạn. Trong ví dụ của bạn, bạn có thể thiết lập điểm cuối hàng tồn kho để cho phép các nhà cung cấp chuyển tin nhắn cho bạn về các lô hàng sản phẩm đến.

Trường hợp 4: Bạn đã phân tích toàn bộ doanh nghiệp mã của mình và thấy rằng các nhóm riêng biệt đã tạo ra cùng một thứ (chỉ được thực hiện hơi khác nhau). Với lớp dịch vụ, bạn có thể chọn (các) phương pháp tốt nhất và bây giờ bạn có thể thực hiện quy trình tương tự trên tất cả các nhóm bằng cách yêu cầu họ gọi vào dịch vụ. Một lợi ích khác để tập trung logic là khi tìm thấy lỗi. Bây giờ bạn có thể triển khai sửa lỗi một lần và tất cả khách hàng được hưởng lợi ích cùng một lúc.

Tất cả điều này đang được nói có những tiêu cực tiềm năng cho một lớp dịch vụ.

  1. Thêm sự phức tạp của hệ thống. Trường hợp trước đây bạn chỉ có một ứng dụng để gỡ lỗi thì bây giờ bạn có hai ứng dụng. Sự cố sản xuất yêu cầu kiểm tra cài đặt ứng dụng khách, cài đặt ứng dụng dịch vụ hoặc sự cố giao tiếp giữa các ứng dụng máy khách và máy chủ được thiết lập chính xác. Điều này có thể khó khăn nếu bạn chưa bao giờ làm điều đó trước đây.
  2. Một điểm thất bại. Nếu bạn bị mất dịch vụ, tất cả khách hàng đều bị ảnh hưởng. Khi mã không được triển khai theo cách này, rủi ro có thể ít hơn (mặc dù có nhiều cách để giảm thiểu điều này).
  3. Phiên bản có thể khó hơn để làm. Khi bạn có một ứng dụng sử dụng dịch vụ triển khai thay đổi giao diện có thể được thực hiện cùng một lúc giữa hai ứng dụng. Khi bạn có nhiều khách hàng, bạn phải quản lý ai là người trên V1, người đang ở V2 và điều phối việc loại bỏ V1 (khi bạn biết mọi người đã cập nhật lên V2).

Điểm chính là nó không phải lúc nào cũng là một cú hích để làm cho dịch vụ hệ thống của bạn được định hướng. Theo kinh nghiệm của tôi, đó thường là một ý tưởng tốt (tôi có xu hướng cấu trúc các ứng dụng theo cách này), nhưng đó không phải là một quyết định tự động. Vào cuối ngày, bạn cần cân nhắc những ưu và nhược điểm và đưa ra quyết định phù hợp với tình huống của mình.


2
+1 Cảm ơn bạn đã trả lời thông tin. Tôi thực sự đã nghi ngờ thời tiết để chấp nhận câu trả lời của bạn hoặc câu trả lời của Deco. Cuối cùng vì tôi không quá kinh nghiệm nên tôi quyết định chọn câu trả lời được nhiều người ủng hộ nhất. Tôi vẫn cảm thấy rằng câu trả lời của bạn sẽ xứng đáng được nâng cao hơn. Trong mọi trường hợp tôi thực sự đánh giá cao rằng bạn đã chia sẻ kiến ​​thức và kinh nghiệm của bạn. Cảm ơn bạn!
Sinh ra ToCode

1
Chào mừng bạn! Điểm chính để loại bỏ cả hai câu trả lời là đây là (chủ yếu) về việc giải quyết các vấn đề bảo trì với việc có nhiều khách hàng cần phải làm điều tương tự. Số lượng khách hàng sử dụng dịch vụ càng nhiều, mức tăng bảo trì cho bạn càng lớn.
Phil Patterson

1
Ngoài ra còn có các lớp dịch vụ bảo mật có thể cung cấp một bức tường khác cho tin tặc vi phạm để đến kho báu trong DB. Việc thiếu các lớp dịch vụ có lẽ là lý do tại sao rất nhiều trang web bị vi phạm lớn, với một dịch vụ ở giữa, tin tặc sẽ nhận được ít dữ liệu hơn đáng kể trước khi chúng bị phát hiện.
gbjbaanb

6

Hầu hết các lớp dịch vụ tôi đã thấy là một mớ hỗn độn. Các dịch vụ có xu hướng có rất nhiều phương pháp khác nhau, 1500 LỘC không phải là hiếm. Các phương thức khác nhau không có gì chung, nhưng hãy chia sẻ mã. Điều này dẫn đến khớp nối cao , độ kết dính thấp . Nó cũng vi phạm OCP , vì mỗi khi cần một thao tác mới, bạn phải sửa đổi mã thay vì mở rộng cơ sở mã. Một lớp dịch vụ được xây dựng tốt về mặt lý thuyết là có thể, nhưng tôi chưa bao giờ thấy nó trong thực tế.

CQRS giải quyết những vấn đề này và ngăn bạn khỏi phải tạo một trong những lớp dịch vụ thủ tục đó.


2
Xây dựng tốt theo tiêu chuẩn của ai? Chắc chắn theo tiêu chuẩn OO, giao diện lớp dịch vụ là một sự hỗn loạn hoàn toàn của một mớ hỗn độn. Từ quan điểm chức năng hoặc thủ tục sau đó nó khuyến khích một cách tiếp cận thiết kế lớp đẹp. Tôi nghĩ rằng những người bị treo cổ lớn nhất có các lớp dịch vụ là họ khuyến khích một ứng dụng dựa trên giao dịch phi trạng thái và không khuyến khích một cách tiếp cận hướng đối tượng thuần túy. Tôi có thể hiểu cả hai mặt của tranh luận.
maple_shaft

6

Thêm một giao diện (một lớp dịch vụ là một loại giao diện) cần có thời gian. Một cái tốt cần rất nhiều thời gian để thiết kế và thử nghiệm. Điều rất quan trọng để có được nó ngay lần thử đầu tiên bởi vì việc thay đổi nó sau đó sẽ phá vỡ tất cả các khách hàng. Ngoài ra, hãy xem xét rằng bạn có thể sẽ không biết những gì cần có trong giao diện đó cho đến khi bạn có một khách hàng thứ hai với các nhu cầu hơi khác nhau. Duy trì một dịch vụ là một dự án không bao giờ kết thúc.

Trong hầu hết các tổ chức, nếu bạn đến nhà tài trợ kinh doanh của mình và hỏi họ: "Bạn có muốn các bộ phận khác nhận được lợi ích (tái sử dụng) hệ thống này mà chúng tôi đang phát triển với ngân sách của bạn không?" họ sẽ cười bạn Làm cho nó hoạt động cho nhà tài trợ doanh nghiệp của bạn trước, sau đó bắt đầu xoay vòng với việc sử dụng lại mã đó (vào thời gian riêng của bộ phận của bạn).

Nếu bạn biết, thực tế, chức năng bạn đang viết hôm nay sẽ được sử dụng lại bởi nhiều khách hàng dịch vụ khác nhau, sau đó xem xét thiết kế một lớp dịch vụ ngay từ ngày đầu. Nếu bạn không chắc chắn, hoặc có nhiều ẩn số trong dự án, hãy lấy thứ gì đó đơn giản làm việc trước và tách nó thành dịch vụ và máy khách sau nếu bạn có thời gian và ngân sách. Dễ dàng hơn nhiều để có được giao diện dịch vụ ngay lần thử đầu tiên khi bạn bắt đầu với một hệ thống làm việc.

Tái bút: Nếu bạn đang làm việc trong Java, Joshua Bloch có rất nhiều lời khuyên về giao diện tuyệt vời trong suốt cuốn sách của mình, Java hiệu quả.


Một câu trả lời tuyệt vời mà không có lý thuyết vô trùng.
danilo

2

Tôi đồng ý với bạn. Không cần thêm một lớp nữa nếu bạn đang sử dụng một UI.

DAL, BL và UI / Bộ điều khiển là sự kết hợp tốt để thiết kế một ứng dụng. Nếu bạn đang dự định đi với một giao diện người dùng duy nhất, không cần phải chuẩn bị thêm một lớp. Bao gồm thêm 1 lớp vào ứng dụng chỉ làm tăng nỗ lực / thời gian phát triển.

Một schenerio khác là sử dụng nhiều UI trong ứng dụng của bạn, thật tốt khi có một lớp dịch vụ để xử lý UI trong trường hợp này.

Stack Overflow: Thảo luận về mẫu lớp dịch vụ


Vì vậy, bạn có đề nghị rằng trên mỗi ứng dụng phức tạp, người ta nên sử dụng một lớp dịch vụ và không chỉ giải quyết cho các lớp DAL, BL, UI?
Sinh ra ToCode

Trong trường hợp có nhiều UI chúng ta phải bao gồm một lớp dịch vụ. Trong trường hợp của bạn, tôi không nghĩ cần phải chuẩn bị một lớp mới. Nó chỉ làm tăng sự phức tạp của ứng dụng.
Satish Pandey

0

Tôi sẽ tranh luận rằng BL của bạn là lớp dịch vụ của bạn. Một nơi trung tâm nơi logic kinh doanh của bạn ngồi. Đây phải là một DLL có thể được sử dụng bởi bất cứ thứ gì cần logic đó. Sau đó, bạn có thể đặt một lớp api web lên trên đó nếu ứng dụng của bạn sẽ có các giao diện người dùng 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.