Служба WCF с собственным размещением. Как получить доступ к объекту (ам), реализующим контракт на обслуживание, из приложения хостинга? - PullRequest
7 голосов
/ 12 августа 2010

Я самостоятельно размещаю службу WCF в клиенте WPF.Я хочу показать данные, которые служба получает в пользовательском интерфейсе.Каждый раз, когда поступают некоторые данные, пользовательский интерфейс должен обновляться.

Код в "App.xaml.cs" выглядит так:

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

Как я могу получить экземпляр (ы) объектареализация контракта на обслуживание из приложения WPF хостинга?


Спасибо всем за ответы.

Чего я не видел, так это того, что конструктор ServiceHost позволяет передавать экземпляр службы вместо ее типа .

Итак, что я делаю сейчас:

  • Использование ObservableCollection в реализации службы
  • Настройте службу как одиночную (см. Комментарий theburningmonk)
  • Привязка к ObservableCollection в моем приложении WPF
  • Получение экземпляра службы с помощью свойства привязки данных DataContext
  • Передайте его конструктору ServiceHost

Результат: Каждое обновление в одноэлементной службе WCF отражается в пользовательском интерфейсе.

Happy!

Ответы [ 2 ]

13 голосов
/ 12 августа 2010

Как сказал marc_s, вы создаете службу PerCall / PerSession WCF, и новый экземпляр создается при каждом запросе / первом запросе каждого сеанса.

Вы можете построить несколько сантехнических операций вокруг него, чтобы экземпляр мог уведомлять хост службы о получении нового запроса, но это не будет легким упражнением, и вам следует помнить о возможности утечки памяти, есливы решаете использовать события, чтобы сделать это - без реализации Слабого шаблона событий ваши экземпляры службы WCF могут остаться без движения, так как обработчики событий по-прежнему хранят ссылку на них, ЕСЛИ вы не забыли уведомить хост, чтобы отписаться, когда экземпляры службы WCF

Вместо этого, вот две идеи, которые могут помочь вам в достижении вашей цели:

Используйте Single InstanceContextMode , если вашСлужба может быть сделана одиночной, и в этом случае вы создадите новый экземпляр, который реализует ваш контракт на обслуживание, и разместите его:

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

, чтобы у вас был доступ к экземпляру, который будет извлекать клиентские запросы.

Кроме того, вы можете иметь все размещенные инстЭто могут быть фиктивные «фасады», которые разделяют статический класс, который на самом деле обрабатывает запросы:

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

Я бы сказал, что вам следует использовать первый подход, если это возможно, делает жизнь немного проще!

1 голос
/ 12 августа 2010

Нет ни одного доступного экземпляра объекта типа MyService - по умолчанию WCF использует модель для каждого вызова, например, для каждого входящего запроса будет создан новый экземпляр MyService, используемый дляобработать этот запрос, а затем освободить.

Поэтому, если нет хотя бы одного запущенного запроса, скорее всего, не существует ни одного экземпляра службы вокруг.

Что именно вы хотите достичь с этим ??Возможно, вам нужно переосмыслить свой подход и перейти от экземпляра класса обслуживания - у него есть свойство .Host, которое ссылается на хост, на котором размещен этот конкретный экземпляр службы.

...