Я неопытный, когда дело доходит до WCF, и я не могу найти безболезненный способ издеваться над сервисами WCF.
Ситуация: клиент и сервер, которые оба имеют доступ к интерфейсу, определяющему сервис, например:
public interface ICustomerService
{
[OperationContract]
Customer GetCustomer(int id);
}
Теперь мой первый вопрос, если есть причина, по которой вы не захотитеЯ хочу, чтобы клиент и сервер использовали один и тот же тип интерфейса, который определяет службу в общей библиотеке.Конечно, это просто невозможно, если пользователи сервиса не являются .NET или вы предоставляете его третьим лицам, у которых нет библиотеки, но я делюсь ею, когда она равна возможность не повредит этим другим сценариям, верно?
Во-вторых, если это неплохая идея, как я могу заставить Visual Studio повторно использовать интерфейс службы?Мне удалось заставить его разделить тип Customer
, проверив Re-use types
, который также определен в общей сборке, но все равно заново генерирует интерфейс.
Но, независимо от этих проблем, как мне сделать клиента насмешливым?Если я пройду через сгенерированные сервисные ссылки VS, я получу конкретный тип для работы, но я не хочу, чтобы мой код когда-либо ссылался на этот тип напрямую, я хотел бы поговорить с интерфейсом.Если я предоставляю сгенерированный клиент как ICustomerService
, который работает, у меня нет метода Close
, так как интерфейс не определяет его.
Я также подумал о следующем подходе и полностью отказался от автоматически генерируемого клиента и просто написал клиент сам, как это тривиально:
public interface IServiceClient<T>
{
void Close();
T Services { get; }
}
public class CustomerServiceClient : ClientBase<ICustomerService>, ICustomerService, IServiceClient<ICustomerService>
{
public Customer GetCustomer(int id)
{
return base.Channel.GetCustomer(id);
}
public ICustomerService Services
{
get { return this; }
}
}
Это работает, и я могу выставить его как IServiceClient<ICustomerService>
к моему контейнеру IoC, но с оговоркой, что теперь он client.Services.GetCustomer(1)
и что я потерял преимущество в том, что легко перегенерировал моего клиента при изменении интерфейса ICustomerService
.Это простой код, который нужно добавить, но он все еще может раздражать.
Другая возможность заключается в использовании того факта, что сгенерированный класс имеет значение partial
.Это также работает, когда я делаю это:
interface ICloseable
{
void Close();
}
interface ClientInterface : ICustomerService, ICloseable
{
}
partial class CustomerServiceClient : IClientInterface
{
}
Но это создало фиктивный класс и интерфейс, который не является катастрофой, но не очень красив.
Прежде чем идти по какому-либо маршруту, есть ли что-то очевидное, что я упустил из виду?