Как использовать инъекцию в WCF - PullRequest
0 голосов
/ 28 мая 2011

У меня есть два класса, реализующих контракт в сервисе, который потребляется с фабрики на клиенте, как показано ниже.

[ServiceContract]
public interface MyInterface {
    void DoSomething()
}


public class A : MyInterface {
    public void DoSomething(){
       "Hi I'm A"
    }
}

public class B : MyInterface {
     public void DoSomething(){
         "Hi I'm B"
     }
}

public class MyFactory <TMyInterface> {
     void DoSomething(){
         TMyInterface.DoSomething()
     }
}

Клиент должен оставаться таким же.У меня вопрос, как я могу выбрать на стороне сервера, какую реализацию MyInterface использовать, передав параметр type с помощью файла .config в WCF

Я читаю другой пост, но пока не понимаю: (*

1 Ответ

1 голос
/ 29 мая 2011

Это можно сделать, и есть несколько способов сделать это.

Одна возможность - создать службу маршрутизации, которая будет содержать «публичный» адрес, с которым клиент всегда общается,Эта служба маршрутизации может затем, на основе некоторой конфигурации, перенаправить вызов соответствующей «реальной» службе.

Другой способ - фактически запустить процесс, который запускает обе службы, но их адресаопределены в конфиге.Если вы используете ту же привязку и тот же контракт (что имеет место), то вы можете «перевернуть» адрес службы, когда вы хотите изменить службу, которая будет принимать вызовы от клиента.Например, эта конфигурация направляет запросы к конечной точке в «http://machine -name: 8000 / Service» для службы A. Обратите внимание, что, поскольку вы определяете узлы служб для обеих служб, вам фактически необходим базовый адрес для службы Bтакже - в этом случае я использовал именованные каналы, к которым нельзя получить доступ через разные машины.

  <system.serviceModel>
    <services>
      <service name="A">
        <host>
          <baseAddresses>
            <add baseAddress="http://machine-name:8000/Service"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="basicHttpBinding" contract="MyInterface" />
      </service>
      <service name="B">
        <host>
          <baseAddresses>
            <add baseAddress="net.pipe://localhost/ServiceBackup"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="netNamedPipeBinding" contract="MyInterface" />
      </service>
    </services>
  </system.serviceModel>

когда вы хотите изменить адрес для B, вы должны поменять местами адреса.

  <system.serviceModel>
    <services>
      <service name="A">
        <host>
          <baseAddresses>
            <add baseAddress="net.pipe://localhost/ServiceBackup"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="netNamedPipeBinding" contract="MyInterface" />
      </service>
      <service name="B">
        <host>
          <baseAddresses>
            <add baseAddress="http://machine-name:8000/Service"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="basicHttpBinding" contract="MyInterface" />
      </service>
    </services>
  </system.serviceModel>

Программа хостинга будет выглядеть следующим образом:

public static void HostServices()
{
    ServiceHost hostA = new ServiceHost(typeof(A));
    ServiceHost hostB = new ServiceHost(typeof(B));
    hostA.Open();
    hostB.Open();
    Console.WriteLine("Press ENTER to close");
    Console.ReadLine();
    hostA.Close();
    hostB.Close();
}

Теперь, если ваши службы размещены в IIS (веб-хостинг), то это немного сложнее.Поскольку для «нормальной» активации требуется, чтобы файл .svc был частью адреса конечной точки, а каждый файл .svc связан с одним классом, адрес для A будет выглядеть примерно так: http://machine -name / services /a.svc , а адрес для B будет выглядеть примерно так: http://machine -name / services / b.svc .Поэтому в этом случае вам нужно создать пользовательскую ServiceHostFactory и использовать интеграцию маршрутов ASP.NET для создания URL-адреса без .svc для вашей службы.Затем вы будете использовать что-то похожее на предыдущий пример, чтобы решить, какая служба будет активирована.

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