Агрегирующие интерфейсы в C # - PullRequest
6 голосов
/ 17 мая 2011

У меня есть этот класс:

class UrlManagementServiceClient : System.ServiceModel.ClientBase<IUrlManagementService>, IUrlManagementService

ClientBase реализует IDisposable и ICommunicationObject.У меня также есть этот интерфейс:

interface IUrlManagementProxy : IUrlManagementService, ICommunicationObject, IDisposable

Но я не могу привести UrlManagementServiceClient объекты к IUrlManagementProxy.Есть ли способ сделать это?Я хочу получить объект, который может получить доступ ко всем методам на всех трех интерфейсах.

Ответы [ 5 ]

4 голосов
/ 17 мая 2011

Вы можете приводить только к интерфейсам, которые унаследованы, чтобы иметь возможность приводить к IUrlManagementProxy, вам необходимо реализовать этот интерфейс.

class UrlManagementServiceClient :
   System.ServiceModel.ClientBase<IUrlManagementService>, IUrlManagementProxy

Затем вы можете разыграть UrlManagementServiceClient либо UrlManagementProxy, IUrlManagementService, ICommunicationObject или IDisposable.

Редактировать
Сгенерированные WCF классы являются частичными, это означает, что вы можете расширить определение класса в другом файле. Положить

public partial class UrlManagementServiceClient : IUrlManagementProxy {}

в другом файле кода, и ваш класс также реализует ваш полный интерфейс IUrlManagementProxy, и вы можете затем преобразовать его в IUrlManagementProxy.

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

Сделать UrlManagementServiceClient орудие IUrlManagementProxy вместо IUrlManagementService

class UrlManagementServiceClient : System.ServiceModel.ClientBase<IUrlManagementProxy>, IUrlManagementProxy
0 голосов
/ 18 мая 2011

Чтобы решить эту проблему, я просто расширил класс и объявил интерфейс агрегирования:

public class UrlManagementProxy : UrlManagementServiceClient, IUrlManagementProxy
{
    public UrlManagementProxy(Binding binding, EndpointAddress remoteAddress)
        : base(binding, remoteAddress)
    {
    }
}

Затем я использую UrlManagementProxy вместо UrlManagementServiceClient.

Мне нужно толькопройти через конструкторы, которые мне нужны.Все остальное обрабатывается автоматически.Также, таким образом, мне не нужно изменять UrlManagementServiceClient, чтобы я мог заново сгенерировать его, и все будет работать.

0 голосов
/ 17 мая 2011

Вы, очевидно, не можете привести объект к интерфейсу, который он не реализует.

Но что вы можете сделать (если имеет смысл реализовать все методы для каждого из этих интерфейсов из экземпляра UrlManagementServiceClient), это обернуть ваш UrlManagementServiceClient вобъект, который реализует необходимые вам интерфейсы.

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

Другими словами, вам потребуется новый класс:

public class UrlManagementClientProxy : IUrlManagementProxy 
{
     // we need a reference to the underlying client
     private readonly UrlManagementServiceClient _client;

     // underlying client is passed to the proxy in constructor
     public UrlManagementClientProxy(UrlManagementServiceClient client)
     {
         _client = client;
     }

     #region IUrlManagementProxy methods

     // you implementation goes here. if the underlying client
     // already implements a certain method, then you just need
     // to pass the call 

     // for example, client already implements methods
     // from the IUrlManagementService interface, so use them

     public string GetUrl() // made up
     {
          return _client.GetUrl();
     }

     #endregion
}

Это позволяет повторно использовать реализацию клиента и добавить дополнительные функции поверх него.

0 голосов
/ 17 мая 2011

Вам нужно реализовать IUrlManagementProxy на UrlManagementServiceClient. Другого пути нет - это отдельный тип.

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