Правильный метод «зацепки» кода в экземпляр WCF? - PullRequest
1 голос
/ 10 марта 2010

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

В настоящее время я работаю над тем, чтобы внутри службы WCF было несколько событий, которые позволили бы форме добавлять слушателей, чтобы она могла производить свою статистику. Это правильный путь для достижения моей цели или есть более специфический механизм WCF для нее?

Ответы [ 3 ]

1 голос
/ 10 марта 2010

Как уже было предложено, статические счетчики или события и слушатели могут технически добиться цели, но если вы стремитесь к более универсальным решениям, это может быть реализовано с помощью Dependency Injection (DI).

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

Вам необходимо внедрить Медиатор в вашу службу WCF. Это можно сделать с помощью пользовательского ServiceHost, который назначает пользовательский IInstanceProvider контракту на обслуживание. До выхода главы 7 моей книги лучший план, который я знаю о том, как включить Конструкторское внедрение для WCF, - это это сообщение в блоге , если учесть, что делегат просто анонимный интерфейс .

Имея это в виду, рассмотрите возможность использования регистратора статистики как Декоратор для «реальной» службы, поскольку это даст вам лучшее разделение интересов . Примерно так:

[ServiceContract]
public interface IMyService
{
    [OperationContract]
    Foo DoStuff(Bar bar);
}

public class StatisticsDecorator : IMyService
{
    private readonly IMyService service;
    private readonly IMediator mediator;

    public StatisticsDecorator(IMyService service, IMediator mediator)
    {
        if(service == null)
        {
            throw new ArgumentNullException("service");
        }
        if(mediator == null)
        {
            throw new ArgumentNullException("mediator");
        }

        this.service = service;
        this.mediator = mediator;
    }

    public Foo DoStuff(Bar bar)
    {
        this.mediator.SignalBeforeDoStuff();
        var result = this.service.DoStuff(bar);
        this.mediator.SignalAferDoStuff();
        return result;
    }
}

Во время выполнения вы должны внедрить «реальную» реализацию IMyService в StatisticsDecorator вместе с общим посредником.

Если вы используете DI-контейнер, вы можете использовать его возможности перехват вместо ручного поворота декоратора, но концепция та же.

1 голос
/ 10 марта 2010

«Стандартный» подход заключается в использовании счетчиков производительности, но если вы (когда-либо / только) хотите сообщить о процессе хостинга, который немного излишним.

Вы можете использовать события + слушателей, мне кажется, хорошо.
Или используйте простые статические счетчики и Interlocked.Increment (), это будет самый быстрый способ.

0 голосов
/ 10 марта 2010

WCF также предоставляет возможность разработки пользовательских поведений, позволяя вам проверять и расширять аспекты вызова метода службы. Например, существуют настраиваемые поведения для проверки параметров метода, для проверки содержимого сообщения и для контроля того, как вызывается операция. Эта статья в журнале MSDN является хорошим обзором поведения пользователя.

Я не уверен, каковы ваши потребности в инструментах, поэтому я не могу точно сказать, подходит ли это для того, что вы собираетесь делать. ИМХО, события + слушатели также являются жизнеспособным решением. Возможно, лучшая ставка может быть даже в комбинации этих двух.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...