2010-08-12 8 views
6

Samodzielnie obsługuję usługę WCF w kliencie WPF. Chcę pokazać dane, które usługa otrzymuje w interfejsie użytkownika. Za każdym razem, gdy niektóre dane są odbierane, interfejs użytkownika powinien zostać zaktualizowany.Samohostowana usługa WCF: Jak uzyskać dostęp do obiektu (obiektów) realizującego umowę o świadczenie usług z aplikacji hostingowej?

Kod w „App.xaml.cs” wygląda

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(); 
    } 

Jak mogę uzyskać instancję obiektu (ów) wdrażającego umowę serwisową z hostingu aplikacji WPF?


Dziękuję wszystkim za odpowiedzi.

Co nie widzę, że konstruktor ServiceHost pozwala przekazać instancji usługi zamiast jego typu.

Więc co mam teraz zrobić, to:

  • Użyj ObservableCollection w realizacji usług
  • skonfigurować usługę być pojedyncza (patrz komentarz theburningmonk za)
  • wiążą się z ObservableCollection w moim aplikacji WPF
  • Uzyskaj instancję usługi przy użyciu właściwości databinding DataContext
  • Przekaż ją do konstruktora ServiceHost

Wynik: Każda aktualizacja usługi singleton WCF znajduje odzwierciedlenie w interfejsie użytkownika.

Happy!

+0

Masz klasę (MyService). Myślę, że masz na myśli: jak uzyskać instancję (obiekty) obiektu. –

+0

Dziękuję, to prawda, zmieniłem pytanie. – Robert

Odpowiedz

12

Jak powiedział marc_s, tworzysz usługę WCF PerCall/PerSession i nowe wystąpienie jest tworzone na każde żądanie/pierwsze żądanie każdej sesji.

Można zbudować wokół niego instalację wodnokanalizacyjną, aby instancja mogła powiadomić usługodawcę o otrzymaniu nowego żądania, ale nie będzie to łatwe ćwiczenie i należy pamiętać o potencjalnym wycieku pamięci, jeśli zdecydujesz aby użyć zdarzeń do wykonania tej czynności - bez implementacji słabego wzorca zdarzeń twoje wystąpienia usługi WCF mogą pozostać zawieszone, ponieważ procedury obsługi zdarzeń nadal zawierają odwołania do nich, O ile nie pamiętasz powiadomienia hosta o anulowaniu subskrypcji po usunięciu wystąpień usługi WCF .

Zamiast tego, oto dwie idee, które mogą ułatwić Ci osiągnąć swój cel:

obsługi pojedynczeInstanceContextMode jeżeli usługa może być pojedyncza, w którym to przypadku można utworzyć nową instancję, która implementuje twoją umowę serwisową i hostuje ją:

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

w ten sposób będziesz mieć dostęp do instancji, która będzie pobierać żądania klientów.

Alternatywnie, można mieć wszystkie hostowane instancje być manekina fascades ", które dzielą statyczną klasę, która przetwarza żądania:

[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; 

Powiedziałbym, należy udać się z pierwszym podejściem, jeśli to możliwe, sprawia, że ​​życie jest łatwiejsze!

+0

Dziękuję, świetny komentarz, wskazał mi dokładnie w prawo. – Robert

+0

Nie problem człowieku, cieszę się z pomocy! – theburningmonk

1

Dostępne jest tylko jedno wystąpienie obiektu typu MyService - domyślnie WCF korzysta z modelu wywołania na żądanie, np. dla każdego przychodzącego żądania zostanie utworzona nowa instancja MyService, używana do obsługi tego żądania, a następnie zwalniana.

Dlatego też, jeśli nie ma co najmniej jednego uruchomionego żądania, najprawdopodobniej nie ma żadnego wystąpienia usługi.

Co dokładnie chcesz osiągnąć dzięki temu? Być może trzeba ponownie przemyśleć swoje podejście i przejść z instancji klasy usług - ma ona właściwość .Host, która łączy się z hostem, który hostuje tę konkretną instancję usługi.

Powiązane problemy