Я ищу способ, чтобы сгенерированный прокси-класс для веб-ссылки (не 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
}
}