2010-08-12 31 views
6

Tôi đang tự lưu trữ một dịch vụ WCF trong một máy khách WPF. Tôi muốn hiển thị dữ liệu mà dịch vụ nhận được trong giao diện người dùng. Mỗi khi nhận được một số dữ liệu, giao diện người dùng sẽ được cập nhật.Dịch vụ WCF tự lưu trữ: Cách truy cập (các) đối tượng thực hiện hợp đồng dịch vụ từ ứng dụng lưu trữ?

Mã trong "App.xaml.cs" trông giống như

private ServiceHost _host = new ServiceHost(typeof(MyService)); 

    private void Application_Startup(object sender, StartupEventArgs e) 
    { 
     _host.Open(); 
    } 

    private void Application_Exit(object sender, ExitEventArgs e) 
    { 
     _host.Close(); 
    } 

Làm thế nào tôi có thể nhận được các trường hợp đối tượng (s) thực hiện các hợp đồng dịch vụ từ các ứng dụng WPF lưu trữ?


Cảm ơn mọi người đã trả lời.

Điều tôi không thấy là hàm tạo của ServiceHost cho phép chuyển phiên bản của dịch vụ thay vì loại.

Vì vậy, những gì tôi làm bây giờ là:

  • Sử dụng một ObservableCollection trong việc thực hiện dịch vụ
  • Cấu hình dịch vụ để trở thành một singleton (xem bình luận theburningmonk của)
  • Bind to ObservableCollection trong ứng dụng WPF của tôi
  • Nhận bản sao của dịch vụ bằng cách sử dụng thuộc tính dữ liệu DataContext
  • Chuyển nó cho nhà xây dựng của ServiceHost

Kết quả: Mỗi cập nhật trong các dịch vụ WCF singleton được phản ánh trong giao diện người dùng.

vui vẻ!

+0

Bạn có lớp học (MyService). Ithink bạn có nghĩa là: làm thế nào để có được ví dụ đối tượng (s). –

+0

Cảm ơn bạn, điều đó đúng, tôi đã thay đổi câu hỏi. – Robert

Trả lời

12

Như marc_s nói, bạn đang tạo ra một dịch vụ PerCall/PerSession WCF và một trường hợp mới được tạo trên mọi yêu cầu/yêu cầu đầu tiên của tất cả các phiên làm việc.

Bạn có thể xây dựng một số hệ thống ống nước xung quanh nó để có thể thông báo cho máy chủ dịch vụ khi nó nhận được yêu cầu mới, nhưng nó không phải là một bài tập dễ dàng và bạn cần lưu tâm đến khả năng rò rỉ bộ nhớ nếu bạn quyết định để sử dụng các sự kiện để thực hiện điều này - mà không cần triển khai thực hiện sự kiện Weak Event Pattern, các trường hợp dịch vụ WCF của bạn có thể bị treo xung quanh vì các trình xử lý sự kiện vẫn giữ một tham chiếu đến chúng UNLESS bạn nhớ thông báo cho host hủy đăng ký khi các cá thể dịch vụ WCF được xử lý .

Thay vào đó, đây là hai ý tưởng mà có thể làm cho nó dễ dàng hơn cho bạn để đạt được mục tiêu của bạn:

Sử dụng ĐộcInstanceContextMode nếu dịch vụ của bạn có thể được thực hiện một singleton, trong trường hợp này bạn sẽ tạo một đối tượng mới triển khai hợp đồng dịch vụ của bạn và lưu trữ:

// instance will be your WCF service instance 
private ServiceHost _host = new ServiceHost(instance); 

theo cách đó bạn sẽ có quyền truy cập vào cá thể sẽ truy xuất yêu cầu của khách hàng.

Ngoài ra, bạn có thể có tất cả các trường hợp tổ chức được hình nộm 'fascades' mà chia sẻ một lớp tĩnh mà thực sự xử lý các yêu cầu:

[ServiceContract] 
interface IMyService { ... } 

interface IMyServiceFascade : IMyService { ... } 

// dummy fascade 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall] 
public class MyServiceFascade : IMyServiceFascade 
{ 
    private static IMyService _serviceInstance = new MyService(); 

    public static IMyService ServiceInstance { get { return _serviceInstance; } } 

    public int MyMethod() 
    { 
     return _serviceInstance.MyMethod(); 
    } 
    ... 
} 

// the logic class that does the work 
public class MyService : IMyService { ... } 

// then host the fascade 
var host = new ServiceHost(typeof(MyServiceFascade)); 

// but you can still access the actual service class 
var serviceInstance = MyServiceFascade.ServiceInstance; 

Tôi muốn nói rằng bạn nên đi với cách tiếp cận đầu tiên nếu có thể, làm cho cuộc sống dễ dàng hơn một chút!

+0

Cảm ơn bạn, nhận xét tuyệt vời, đã chỉ cho tôi đúng hướng. – Robert

+0

Không phải là một người đàn ông vấn đề, vui mừng được giúp đỡ! – theburningmonk

1

Không có một đối tượng duy nhất của loại MyService có sẵn - theo mặc định, WCF sử dụng mô hình cho mỗi cuộc gọi, ví dụ: cho mỗi yêu cầu đi kèm, một phiên bản mới của MyService sẽ được tạo, được sử dụng để xử lý yêu cầu đó và sau đó được giải phóng.

Vì vậy, trừ khi có ít nhất một yêu cầu chạy, có nhiều khả năng nhất không phải là bất kỳ trường hợp của dịch vụ xung quanh.

Chính xác những gì bạn muốn đạt được với điều này ?? Có lẽ bạn cần phải suy nghĩ lại cách tiếp cận của bạn và đi từ các ví dụ lớp dịch vụ - nó có một tài sản .Host nối trở lại máy chủ đang hosting mà dụ dịch vụ cụ thể.

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