Tôi sẽ tiếp tục và nói trước điều này bằng cách nói: Tôi có phần mới với WCF.Các vấn đề với mẫu đơn bên trong phương thức dịch vụ WCF
Tôi đang làm việc trên một quy trình phía máy chủ chịu trách nhiệm thực hiện rất nhiều logic nghiệp vụ. Nó có thể truy cập từ một khách hàng thông qua WCF.
Phương thức WCF chính của tôi yêu cầu một số phương thức riêng tư khác. Thay vì đi qua tất cả "dữ liệu tra cứu" tôi cần cho logic nghiệp vụ cho từng phương thức riêng, tôi quyết định sử dụng một cá thể đơn lẻ của một lớp có tên DataProvider chứa tất cả dữ liệu tra cứu này.
Khi kết thúc thường trình, tôi "giải phóng" dữ liệu tra cứu của DataProvider để lần tiếp theo quy trình được thực hiện, dữ liệu tra cứu mới nhất sẽ được sử dụng.
Vì vậy, đây là một ví dụ đơn giản:
public void Generate()
{
try
{
//populate singleton DataProvider with it's lookup data...
DataProvider.Instance.LoadLookupData();
//do business logic...
}
finally
{
//release provider's lookup data...
DataProvider.Release();
}
}
này hoạt động tuyệt vời cho đến khi tôi có hai khách hàng khác nhau mà thực hiện phương pháp này tại (hoặc gần) cùng một lúc. Vấn đề xảy ra bởi vì họ chia sẻ cùng một cá thể singleton và nhiệm vụ hoàn thành đầu tiên sẽ phát hành DataProvider trước khi hoàn thành khác.
Vì vậy, ...
Tùy chọn của tôi ở đây là gì?
Tôi muốn tránh đi qua tất cả dữ liệu tìm kiếm để mẫu đơn (hoặc một số dẫn xuất) có vẻ như là một lựa chọn tốt. Tôi cũng cần có khả năng hỗ trợ nhiều khách hàng gọi phương thức cùng một lúc.
Tôi tin rằng dịch vụ WCF được định cấu hình là "Mỗi cuộc gọi". Tôi không chắc chắn nếu có một cách để cấu hình một dịch vụ WCF để bộ nhớ tĩnh không được chia sẻ giữa các dịch vụ invocations.
Mọi trợ giúp sẽ được đánh giá cao.
Ai đó sửa tôi nếu tôi sai ở đây, nhưng chuyển dữ liệu tra cứu vào một lớp khác sẽ không tạo bản sao hoàn toàn mới của tất cả dữ liệu của anh ấy, đúng không? Nó sẽ không chỉ là một bản sao của tham chiếu đến dữ liệu? (Trừ khi tất nhiên nó được serialized trên một ranh giới dịch vụ, mà không có khả năng âm thanh trong trường hợp này) –
Tôi muốn hiểu những động lực cho việc có lớp singleton. Có phải thứ gì đó mà bạn chỉ tạo một lần và tất cả những người gọi đến dịch vụ của bạn cần phải có cùng một bản sao dữ liệu không? Hoặc là nó giống như một người gọi trở lại dịch vụ của bạn sẽ nhận được cùng một dữ liệu (phiên)? – Kangkan
Lý do cho "singleton" là logic nghiệp vụ tạo ra khoảng 30 loại đối tượng khác nhau. Mỗi nhu cầu truy cập vào dữ liệu tra cứu. Có lẽ tôi đã lười biếng, nhưng tôi không cảm thấy muốn có cùng một lập luận với hơn 30 nhà xây dựng khác nhau. Lol. Tôi cảm thấy như singleton là cách tiếp cận sạch nhất để mỗi đối tượng có thể dễ dàng truy cập dữ liệu tra cứu. –