Генерация клиента только для одного из интерфейсов контракта на обслуживание, доступных в службе WCF - PullRequest
2 голосов
/ 14 декабря 2011

В настоящее время я выполняю рефакторинг большой службы WCF, которая состоит из одного интерфейса контракта на обслуживание (далее - SCI), используемого несколькими различными клиентскими приложениями.Я разделил SCI так, чтобы для каждого типа клиентского приложения был SCI, специфичный для операций, которые он требует.Некоторые общие разделы SCI определены в базовом SCI, который наследует определенный SCI клиентского приложения.

Существует один класс обслуживания, который реализует все клиентские SCI.Тот факт, что существует ситуация наследования алмазного интерфейса от совместно используемой базовой SCI, иногда означает, что одна и та же операция доступна через несколько SCI.При автоматической генерации клиентов (особенно с помощью асинхронных клиентских методов) результирующий код имеет много уродливых <generated-type>1,2,3 и т. Д.

. Чтобы этого избежать, я хотел бы добавить ссылку на службу для каждого изклиентские приложения, которые только генерируют клиента для SCI, относящегося к этому конкретному приложению.Это не должно привести к проблемам в связи с тем, что одна и та же функция появляется в разных SCI.

Возможно ли это?

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

Ответы [ 2 ]

1 голос
/ 14 декабря 2011

Что вы хотите сделать, это создать интерфейс контракта на обслуживание (вы можете сделать это вручную, извлечь его из исходной реализации сервиса или автоматически сгенерировать его, а затем скопировать).

Тогда вместо использования ссылки на службу используйте фабрику каналов для привязки к вашей службе (как показано ниже). Это лучший способ ссылки на сервисы WCF.

Для этого вам понадобятся следующие ссылки:

using System.ServiceModel;
using System.ServiceModel.Description;

Тогда вы можете использовать следующее:

     var binding = new WebHttpBinding();
     var factory = new ChannelFactory<IMyServiceContract>(binding, new EndpointAddress("http://url:port"));
     factory.Endpoint.Behaviors.Add(new WebHttpBehavior());

     var myService = factory.CreateChannel();

     myService.ServiceMethod();
0 голосов
/ 14 декабря 2011

предложение Люка стоит попробовать.Способ «ChannelFactory» имеет много преимуществ по сравнению с способом автоматической генерации: вы можете хранить комментарии вашего SCi и не нужно обновлять ссылку после изменений SCI.

В процессе работы вам может потребоваться сделать несколько синглтоновChache для производительности и отдельный SCI для реализации Сервиса, так что вы можете ссылаться на свой SCI как в реализации клиента, так и в Сервисе.

Вы упомянули 'async', я думаю, что это может быть проблема конфигурации Binding или Behavior.1005 *

private ChannelFactory CreateFactoryInstance<T>(string endpointConfigurationName, string endpointAddress)
{
    ChannelFactory factory = null;
    factory = new ChannelFactory<T>(endpointConfigurationName, new EndpointAddress(endpointAddress));
    factory.Open();
    return factory;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...