Как получить WCF для генерации списка прокси?

Как получить WCF для создания списка или IEnumerable прокси к реальному объекту? Я делаю это в автономном приложении.

Вот что у меня есть:

public interface IRemoteControlGroup {
     List<IRemoteControl> GetInstances();
}

public class RemoteControlGroupImpl : IRemoteControlGroup {
    public List<IRemoteControl> GetInstances()
    {
        System.Console.Error.WriteLine("Called GetInstances()");
        List<IRemoteControl> list = new List<IRemoteControl>();
        // implementation detail: get this list of IRemoteControl objects
        return list;
    }
}

public interface IRemoteControl {
     void Stop();
     void Start();
     void GetPID();
}

public class RemoteControlImpl : IRemoteControl {
     // actual implementation
}

Я хочу, чтобы WCF:

  • Предложить услугу, RemoteControlGroupImpl, определенные договором о IRemoteControlGroup,
  • Дай мне List<IRemoteControl> когда IRemoteControlGroup.GetInstances() вызывается (на клиенте), где элементы списка являются прокси, которые реализуют IRemoteControl (позвонив фактическому хозяину IRemoteControl объекты).

Я не хочу, чтобы WCF подтолкнул RemoteControlImpl объекты через провод; Я просто хочу подтолкнуть прокси, которые реализуют IRemoteControl, RemoteControlImpl объекты на самом деле содержат дескрипторы локальной системы (дескрипторы окна, потому что наши приложения предоставляют только интерфейс с графическим интерфейсом) и, следовательно, не сериализуемы. Количество элементов, возвращаемых GetInstance() может изменяться.

Я нашел эту статью, которая звучит как то, что я хочу. Вид. Но это не говорит мне, как сделать это в коде; просто в конфигурации. Это также не совсем описывает то, что я хочу. Точка входа для службы предоставляет прокси; но я хочу, чтобы точка входа для моего сервиса доставляла список прокси.

1 ответ

Решение

Как отметил @Джон Сондерс, вам нужно переосмыслить свой подход. Я могу вспомнить пару общих подходов, которые могут быть полезны в зависимости от того, что движет вашими "множественными" экземплярами.

1) Если они управляются извне приложения (т. Е. Список доступных целей IRemoteControl не изменяется динамически во время выполнения), то вы можете выставить один и тот же контракт через несколько конечных точек. Например, http://localhost/remotecontrol.svc/instance1, http://localhost/remotecontrol.svc/instance2 и т. Д. Доступность различных конечных точек может быть опубликована через ваш WSDL.

2) Если несколько целей являются динамическими, то самый простой подход будет переопределить ваш контракт:

public interface IRemoteControlGroup {
     List<string> GetInstances();
     void Stop(string instanceId);
     void Start(string instanceId);
     void GetPID(string instanceId);
}

Внутренне ваша служба будет поддерживать словарь доступных объектов IRemoteControl, снабженный ключом InstanceId, и просто направлять входящую операцию на целевой экземпляр.

Другие вопросы по тегам