Прокси-класс веб-службы для реализации интерфейса - PullRequest
7 голосов
/ 28 сентября 2010

Я ищу способ, чтобы сгенерированный прокси-класс для веб-ссылки (не WCF) реализовал общий интерфейс для простого переключения между доступом к веб-службе и «прямым» доступом к нашему бизнес-уровню в клиентском приложении,что-то вроде:

public IBusiness GetBusinessObject()
{
  if (_mode = "remote")
    return new BusinessWebService.Business(); // access through web service proxy class
  else
    return new Business(); // direct access
}

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

Есть ли какой-нибудь способ заставить сгенерированный прокси-класс ссылаться на эти типы, или я собираюсь сделать этовсе не так?Стоит ли вместо этого рассматривать преобразование веб-службы в службу WCF?


Подробности

Наше решение состоит из следующих четырех проектов:

  • Бизнес-библиотека (содержит бизнес-логику, доступ к хранилищу данных)
  • Общая библиотека (содержит общие функции, включая CustomSerializableType)
  • Веб-служба (действует какпрокси между удаленными клиентами и бизнес-уровнем)
  • Приложение Windows

Наш клиент хочет, чтобы приложение Windows могло работать в двух разных режимах:

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

Для того, чтобы сделатьДля этого мы создали интерфейс IBusiness, который находится в общей библиотеке и содержит все бизнес-методы.

Интерфейс

public interface IBusiness
{
  CustomSerializableType DoSomeWork();
}

Business layer

public class Business : IBusiness
{
  public CustomSerializableType DoSomeWork()
  {
    // access data store
  }
}

Веб-сервис

public class WebServiceBusiness : IBusiness
{
  private Business _business = new Business();

  [WebMethod]
  public CustomSerializableType DoSomeWork()
  {
    return _business.DoSomeWork();
  }
}

Сгенерированный прокси-класс (тонна кода оставлена ​​для удобства чтения)

public partial class Business
  : System.Web.Services.Protocols.SoapHttpClientProtocol
{

  public CustomSerializableType DoSomeWork()
  {
    // ...
  }

  public partial class CustomSerializableType {
    // PROBLEM: this new type is referenced, instead of the
    // type in the common library
  }
}

1 Ответ

6 голосов
/ 30 сентября 2010

Предполагая, что пространством имен по умолчанию для вашего клиента является «Клиент», и что ваша веб-ссылка называется «Прокси», затем выполните следующее:

  1. В корневом каталоге вашего клиентского проекта создайтепапка с именем «Proxy».
  2. В этой папке создайте класс с именем «Business».
  3. Сделайте этот класс общедоступным и частичным, и пусть он реализует ваш IBusiness интерфейс

Таким образом, вам не нужно изменять Reference.cs.Вам не следует никогда изменять файл Reference.cs или любой другой файл, созданный с помощью генерации кода.

Обратите внимание, что это нарушает принципы SOA, тесно связывая ваш клиент с вашим сервисом.По крайней мере, вы должны определить эти интерфейсы в отдельном проекте, чтобы вы делили проект «интерфейс» только между клиентом и службой.

...