Для нескольких wcf сервисов действительно ли возможно реализовать тот же интерфейс контракта на обслуживание?
То, что я хочу сделать, позволяют, чтобы тестовый сервис был взаимозаменяемым для реального сервиса и указал который сервис использоваться в конфигурационном файле.
Например:
[ServiceContract]
public interface IUselessService
{
[OperationContract]
string GetData(int value);
}
Тестовая реализация
public class TestService : IUselessService
{
public string GetData(int value)
{
return "This is a test";
}
}
Реальный класс
public class RealService : IUselessService
{
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
}
Спасибо, ребята, за ваши ответы. Теперь у меня есть решение, которое работает для меня, не помещая интерфейс в отдельную сборку и в GAC. Я не собираюсь использовать интерфейс для других проектов, просто использую один и тот же интерфейс для нескольких служб в одном проекте.
Я пытался сделать изменение между RealService и TestService в файле конфигурации службы WCF, чтобы клиент не знал разницы (клиенту не пришлось бы изменять свою конфигурацию, чтобы указать на другую. svc файл). Я не уверен, что это возможно, или, по крайней мере, если это так, это определенно не так.
Сейчас я просто указываю обе службы в файле конфигурации службы WCF, а затем указываю клиенту на одну или другую в зависимости от того, какая служба мне нужна. Поскольку эта служба WCF предназначена только для внутреннего использования, и мы контролируем и клиента, и службу, это неплохой компромисс. В любом случае это решение, вероятно, более явное в своих намерениях.
Вот фрагмент файла конфигурации:
<services>
<service behaviorConfiguration="WcfService1.Service1Behavior"
name="WcfService1.TestService">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="testBasicHttpBinding"
contract="WcfService1.IUselessService">
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
<service behaviorConfiguration="WcfService1.Service1Behavior"
name="WcfService1.RealService">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="testBasicHttpBinding"
contract="WcfService1.IUselessService">
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
Да, это не только возможно, но и явно входит в проектные замыслы интерфейсов контрактов на обслуживание.
Если вы определяете интерфейс IUselessService внутри отдельной сборки и помещаете его в GAC. Эта сборка не должна ничего реализовывать, только определяет интерфейс IUselessService и некоторые другие типы, которые используют потребности в качестве параметров IUselessService.
И TestService, и RealService должны реализовывать один и тот же интерфейс IUselessService. Я имею в виду, что вы должны создать два дополнительных проекта для каждой службы, тогда TestService и RealService не будут иметь конфликтов типов.