Службы WCF гнездо


Я работаю над созданием структуры SOA для консолидации многочисленных веб-сервисов WCF. По моему опыту, когда мы используем веб-сервисы, мы ограничены очень плоской структурой:

WebService - https://services.site.com/service.svc

  • операция 1
  • Operation2
  • и т. д.

Итак, в приведенном выше примере мы имеем сервис, который имеет набор доступных операций.

Однако мы хотели бы иметь гораздо более иерархическую структуру для доступные операции. Например:

WebService - https://services.site.com/service.svc

Введите описание изображения здесь

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

  • myService.Клиенты.CreateClient (params)
  • myService.Клиенты.Документы.GetDocumentsForClient (params)
  • myService.Товары.CreateProduct (params)

Может ли кто-нибудь предположить, что это это вообще возможно?

1 2

1 ответ:

Я думаю, что Тим правильно в своем комментарии. То, что вы пытаетесь сделать, в высшей степени неортодоксально.

Создание сервиса, который раскрывает иерархическую структуру несвязанных операций, - это не то, для чего предназначены сервисы. Точно так же, как вы не создали бы объект-Бога, который делает 10 различных вещей, чтобы быть потребленным в процессе двоичной ссылкой, Вы не должны пытаться сделать это вне процесса.

Если точечная нотация важна для вас на стороне клиента, то вы можете получить то, что вам нужно. ищем, делая следующее.

Составьте конечные точки службы

namespace Clients
{
    [ServiceContract]
    interface IService
    {
        [OperationContract]
        void CreateClient(params p);
    }
}

namespace Clients.Documents
{
    [ServiceContract]
    interface IService
    {
        [OperationContract]
        List<Document> GetDocumentsForClient(Guid clientKey);
    }
}

namespace Products
{
    [ServiceContract]
    interface IService
    {
        [OperationContract]
        void CreateProduct(params p);
    }
}

Потребляйте конечные точки службы

var service = new ChannelFactory<Clients.IService>().CreateChannel();

var service = new ChannelFactory<Clients.Documents.IService>().CreateChannel();

var service = new ChannelFactory<Products.IService>().CreateChannel();

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

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

...как (чтобы) направлять свои звонки на мои службы - как они обычно делают использовал функцию "Добавить ссылку на службу" visual studio для подключите URL-адреса / конечные точки

Далее к комментариям Тима ниже, в качестве альтернативы вы можете ввести имя элемента конфигурации вашего сервиса из вашего файла конфигурации в контструктор ChannelFactory, как описано здесь.