2009-11-18 31 views
21

Tôi tin rằng Jimmy Nillson nói rằng ông thường làm các dịch vụ webservices của mình. Đây có phải là phương pháp ưa thích và với WCF không? Khác hơn là làm cho các phương thức dịch vụ tĩnh, có cái gì khác để được thực hiện?Dịch vụ WCF có nên đơn lẻ hay không?

+0

Bạn có liên kết đến nơi ai đó đã nói để sử dụng đơn không? Có lẽ có một lý do thuyết phục hơn bất kỳ ai trong chúng ta có thể nghĩ đến ... –

+0

Đó là trong cuốn sách của ông, "Áp dụng thiết kế và mô hình theo hướng miền: Với các ví dụ trong C#". – suedeuno

Trả lời

24

câu trả lời hay, nhưng tôi nghĩ có vấn đề trong câu hỏi ban đầu. "Sử dụng điển hình" của một công nghệ là một câu hỏi được hình thành kém. Không ai có kịch bản "điển hình" và bạn nên xem xét các yêu cầu của vấn đề cụ thể của mình trước khi quyết định triển khai hoặc tiếp cận. Yêu cầu của bạn nên thông báo cho giải pháp của bạn.

Ví dụ, Singletons [tức là mẫu Singleton] chỉ là một công cụ khác trong hộp của chúng tôi, và giống như bất kỳ công cụ nào, có những trường hợp nó hoạt động, và những trường hợp khác thì không. Cụ thể, nếu bạn cần tập trung hóa logic nghiệp vụ [áp dụng nhiều hơn trong một ứng dụng độc lập hơn là một dịch vụ WCF từ xa], hoặc chia sẻ bộ nhớ hoặc tài nguyên, một Singleton hoạt động tốt. Tất nhiên, nếu bạn đang chia sẻ logic kinh doanh, trạng thái được duy trì trong ngăn xếp cuộc gọi, và đa luồng là tranh luận. Nếu chia sẻ bộ nhớ giữa các cuộc gọi của người tiêu dùng, thì đa luồng là một vấn đề. Liên quan đến WCF, có hai chế độ [thực sự ba, nhưng thứ ba là một trường hợp đặc biệt những người đầu tiên] của hành vi multi-threading bạn có thể xác định,

// we are specifying that this service implementation is single-threaded 
// and WCF should permit *at most* one call at a time. Any requests made 
// simultaneously/concurrently are queued. 
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single)] 
public class SingleThreadedNonThreadSafeService : IService { ... } 

// we are specifying that this service implementation is multi-threaded 
// and [hopefully!] thread-safe. WCF should permit any number of threads, 
// or any number of simultaneous concurrent calls. 
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)] 
public class MultiThreadedThreadSafeService : IService { ... } 

Các ý kiến ​​Xml đối với ConcurrencyMode về cơ bản cũng giống như trên.

Nếu bạn KHÔNG cần chia sẻ logic kinh doanh hoặc bộ nhớ giữa người tiêu dùng, sau đó KHÔNG sử dụng một Singleton, các "mô hình" KHÔNG phù hợp với vấn đề. Nó giống như buộc một chiếc dép thủy tinh trên chân của một chị gái! Và không ai phải nhìn thấy điều đó.


Ngược lại, nếu không có trạng thái được chia sẻ giữa các cuộc gọi, lưu trữ một phiên bản mỗi cuộc gọi \ phiên.

+0

Tôi nghĩ rằng việc giải thích của chủ sở hữu câu hỏi đã bị bỏ qua. Tôi nghĩ anh ta đang nói về cá thể máy khách ứng dụng khách proxy chứ không phải bản thân dịch vụ. Trong trường hợp không có nó sẽ làm cho tinh thần để làm cho các wcf lưu trữ một singleton, nó là stateless bởi thiết kế. Tôi tin rằng câu hỏi thực tế mà anh ta đang cố hỏi là: Ví dụ dịch vụ khách hàng của WCF có được người tiêu dùng sử dụng dịch vụ này là đơn hay không? @suedeuno ??? – Seabizkit

19

Thường là NOT. Singletons là một mớ hỗn độn, vì để làm cho chúng hoạt động tốt, bạn sẽ cần phải làm cho chúng đa luồng, và đó chỉ là yêu cầu rắc rối, trừ khi bạn thực sự thực sự thực sự biết những gì bạn đang làm. Thực hành tốt nhất cho WCF là sử dụng instantiation cho mỗi cuộc gọi - mỗi yêu cầu nhận được bản sao riêng của lớp dịch vụ, không lo lắng nhiều luồng, hiệu suất tốt - lưu trữ bất cứ thứ gì cần tồn tại trong cơ sở dữ liệu - hoạt động như quyến rũ.

Kịch bản thực sự duy nhất mà Singleton có thể hiểu là nếu bạn phải yêu cầu dịch vụ được sử dụng/xử lý bởi một nguồn tài nguyên chỉ có sẵn trong một trường hợp duy nhất - nếu dịch vụ singleton của bạn tuần tự và bảo vệ một tài nguyên, sau đó nó có ý nghĩa để sử dụng nó.

Nếu không - hãy tự khắc phục sự cố! :-)

+2

+1 một số đồng nghiệp của tôi đã phát hiện ra điều này một cách khó khăn .... trong quá trình sản xuất. – kemiller2002

+0

nếu anh ta đang truy cập cá thể Hostservice từ trong môi trường lưu trữ (dịch vụ cửa sổ, consoleapp) để gửi cho khách hàng - có thể dễ dàng hơn khi triển khai Mẫu Singleton; nếu không, hãy gửi cho anh ta hoặc là cần tạo một ứng dụng khách, hoặc lấy một cá thể thông qua một nhà cung cấp cá thể. - các tuyến đường khách hàng có thể hữu ích nhưng tôi thấy việc sử dụng những gì đã được tạo ra đã làm việc tốt. Cho đến nay tôi không gặp vấn đề về luồng .. và dịch vụ có hiệu suất tôi cần và có vẻ ổn định. – Stix

8

Dịch vụ Singleton WCF hầu như không bao giờ được sử dụng - Singletons là kẻ thù của khả năng mở rộng! Chúng chỉ có ý nghĩa trong các kịch bản lạ - ghi vào một tệp đơn lẻ, một cổng giao tiếp hoặc thiết bị phần cứng duy nhất.

Như Marc nói sự lựa chọn tốt nhất cho khả năng mở rộng với WCF là cho mỗi dịch vụ cuộc gọi (họ cung cấp thương mại tốt nhất giữa hiệu suất và khả năng mở rộng). Mỗi dịch vụ cuộc gọi cũng hoạt động rất tốt với cân bằng tải.

+0

Có, điều này đã được trả lời khá lâu trước đây nhưng bạn có thể mở rộng khi nhận xét rằng "Mỗi dịch vụ cuộc gọi cũng hoạt động rất tốt với cân bằng tải"? – McArthey

+0

Tôi nghĩ rằng những gì @McArthey chỉ ra là nếu bạn sử dụng dịch vụ 'Mỗi cuộc gọi', nó mang đến cho bạn cơ hội phân phối 'cuộc gọi' trên nhiều máy chủ mà không phải lo lắng về 'trạng thái'. –

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