Оболочка службы WCF - передача endpointConfigurationName в конструктор клиента службы - PullRequest
1 голос
/ 24 августа 2010

У меня есть следующая оболочка, помогающая мне управлять временем жизни клиента wcf:

public class ServiceProxyHelper<TProxy, TChannel> : IDisposable
      where TProxy : ClientBase<TChannel>, new()
      where TChannel : class
   {
      private TProxy m_proxy;

      public TProxy Proxy
      {
         get
         {
            if (m_proxy != null)
            {
               return m_proxy;
            }
            throw new ObjectDisposedException("ServiceProxyHelper");
         }
      }

      protected ServiceProxyHelper()
      {
         m_proxy = new TProxy();
      }

      public void Dispose()
      {
          //....
      }
}

Я использую это следующим образом:

   public class AccountServiceClientWrapper : ServiceProxyHelper<AccountServiceClient, IAccountService>
   {
   }

   public class Test()
   {
      using(AccountServiceClientWrapper wrapper = new AccountServiceClientWrapper())
      {
         wrapper.Proxy.Authenticate();
      }
   }

Как я могу изменить этот код, чтобы предоставить endpointConfigurationName для клиента?

wrapper.Proxy.Endpoint.Name = "MyCustomEndpointName";

не работает. endpointConfigurationName должен быть поставщиком для обслуживания клиента-конструктора, но как я могу это сделать с помощью этой оболочки?

Привет

Ответы [ 2 ]

2 голосов
/ 06 октября 2010

Я хотел бы указать экземпляр TProxy в конструкторе ServiceProxyHelper.

protected ServiceProxyHelper(TProxy proxy)
{
  m_proxy = proxy;
}

Тогда ваш класс-посредник будет выглядеть так:

public class AccountServiceClientWrapper : ServiceProxyHelper<AccountServiceClient, IAccountService>
{
private endpointCfgName = "{endpoint_here}";

public AccountServiceClientWrapper(): base(new AccountServiceClient(endpointCfgName))
        {
            //this.Proxy.ClientCredentials.UserName.UserName = "XYZ";
            //this.Proxy.ClientCredentials.UserName.Password = "XYZ";
        }
}

И затем, способ его использования остается полностью прежним.

Конечно, вам нужно удалить ключевое слово "new" из определения TProxy

1 голос
/ 24 августа 2010

Возможно, вы можете использовать Activator.CreateInstance для создания экземпляра прокси, передающего endpointConfigurationName в качестве параметра. Например,

protected ServiceProxyHelper(string endpointConfigurationName )
{
  m_proxy = (TProxy)Activator.CreateInstance(typeof(TProxy), endpointConfigurationName);
}

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

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