Как передать услугу другому плагину? - PullRequest
0 голосов
/ 04 июня 2010

У меня есть плагин, который я буду создавать во время выполнения, и я хочу передать ему службу WCF с хоста приложения.Хост приложения отвечает за создание соединения с сервисом.Причина этого заключается в том, что один и тот же сервис может использоваться несколькими плагинами, но плагины должны знать только об их интерфейсе, поскольку может быть несколько реализаций IMyPluginServices.Например, метод Run экземпляра плагина будет выглядеть так:

    public void Run(IMyPluginServices services)
    {
        services.DoSomething();
    }

Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как создать службу типа IMyPluginServices и передать ее в функцию Run,Похоже, что ссылка на службу, сгенерированная VS 2010, не создает объект типа IMyPluginServices, который я могу передать ему.Любая помощь будет принята с благодарностью.Спасибо.

1 Ответ

1 голос
/ 04 июня 2010

Когда вы добавляете ссылку на службу в VS 2010 для службы, она генерирует интерфейс с именем IMyService, который содержит методы для каждого OperationContract в вашей службе. Он также генерирует конкретный класс с именем MyServiceClient, который можно создать, а затем использовать для вызова вашего сервиса.

Теперь проблема, с которой вы сталкиваетесь, я полагаю, состоит в том, что MyServiceClient является подклассом ClientBase<IMyService> и не реализует сгенерированный интерфейс IMyService (что является реальной проблемой).

Чтобы обойти эту проблему, я создал новый интерфейс:

public interface IMyServiceClient : IMyService, IDisposable, ICommunicationObject
{
}

(Примечание: IDisposable и ICommunicationObject требуются только в том случае, если вы хотите, чтобы ваш модуль мог обнаруживать / реагировать на неисправные каналы и другие подобные вещи).

Затем я расширяю MyServiceClient частичным классом (в сборке, содержащей мою ссылку на службу WCF):

public partial class MyServiceClient : IMyServiceClient
{
}

Теперь в своих модулях я могу принять IMyServiceClient вместо IMyService и по-прежнему выполнять все необходимые мне методы. Приложение, управляющее модулями, по-прежнему может создавать экземпляры MyServiceClient, как и всегда.

Прелесть этого в том, что вашему новому интерфейсу и частичному классу не нужен какой-либо реальный код - достаточно определений, чтобы выполнить работу.

...