Динамически строящаяся ChannelFactory - PullRequest
2 голосов
/ 04 октября 2009

Я пытаюсь динамически создать ChannelFactory:


var serviceType = GetServiceProxy();
var interfaceType = serviceType.GetServiceInterface(); //return IServiceInterface
var service = new ChannelFactory(binding, address);

проблема, как вы видите, во второй строке, где у меня нет универсального типа, и, к сожалению, у ChannelFactory нет перегрузки, которая принимает тип.

Как-нибудь обойтись?

Ответы [ 2 ]

3 голосов
/ 06 октября 2009

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

для создания «ChannelFactory» и вызова метода «CreateChannel»:


private ChannelFactory CreateChannelFactory()
{
   var channelFactoryType = typeof (ChannelFactory);

   channelFactoryType = channelFactoryType.MakeGenericType(serviceType);

   return (ChannelFactory)Activator.CreateInstance(channelFactoryType, binding, address);
}

private object CreateChannel()
{
   var createchannel = channelFactory.GetType().GetMethod("CreateChannel", new Type[0]);
   return createchannel.Invoke(channelFactory, null);
}

Теперь канал создан, но так как доступен только тип интерфейса, я могу получить только методы для вызова:


var serviceType = service.GetType();
var remoteMethod = service.GetMethod(invocation.Method.Name);

remoteMethod.Invoke(service, invocation.Arguments);

0 голосов
/ 04 октября 2009

Хади : это сообщение на форуме здесь (посмотрите ответ Романа Кисса, представляющего пользовательский ChannelFactory2 класс) адрес того, что вы ищу ??

Если это так, вы можете перестать читать мой ответ: -)

Ну, обычно вы делаете это:

1) есть ваш сервисный интерфейс (IMyServiceInterface)

2) создание / получение информации о привязке и конечной точке

3) Создать фабрику каналов для этого интерфейса:

ChannelFactory<IMyServiceInterface> myChannelFactory =
    new ChannelFactory<IMyServiceInterface>(myBinding, myEndpoint);

4) из этой фабрики каналов создайте клиентский прокси:

IMyServiceInterface client = myChannelFactory.CreateChannel();

5) Вызвать методы на этом клиенте:

client.DoStuff();

Итак, какую часть вы хотите сделать более общей / более динамичной и почему? Какова мотивация / движущая сила этой идеи ??

Марк

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