Несколько служб WCF, реализующих один и тот же интерфейс контракта на обслуживание - PullRequest
5 голосов
/ 27 апреля 2010

Возможно ли для нескольких служб 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);  
  }  
}

Ответы [ 3 ]

5 голосов
/ 27 апреля 2010

Спасибо, ребята, за ваши ответы. Теперь у меня есть решение, которое работает для меня, не помещая интерфейс в отдельную сборку и в 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>
5 голосов
/ 27 апреля 2010

Да, это не только возможно, это явно в рамках намерений разработки интерфейсов контрактов на обслуживание.

2 голосов
/ 27 апреля 2010

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

И TestService, и RealService должны реализовывать один и тот же интерфейс IUselessService. Я имею в виду, что вы должны создать два дополнительных проекта для каждого сервиса, тогда у TestService и RealService не будет конфликтов типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...