Как вернуть объект, который может выполняться на сервере? - PullRequest
3 голосов
/ 14 марта 2010

Исходя из фона Java, я так думаю:

Сервер предоставляет объект клиенту. Этот объект должен быть в состоянии выполнить на сервере.

Сервер:

private string _S = "A";

public interface IFoo { void Bar(); }

private class Foo : IFoo {
    void Bar() { _S = "B";}
}

public IFoo GetFoo() { return new Foo(); }

Клиент:

IFoo foo = serverChannel.GetFoo();
foo.Bar();

Удаленное взаимодействие является устаревшим (вместо этого все продолжают указывать на WCF), и WCF вообще не поддерживает это вообще ( WCF: есть ли способ вернуть объект, который может выполняться на сервере? ) Так как же мне реализовать такое поведение? Использование сторонних компонентов возможно, если это необходимо.

Я искал на SO, но не нашел подобного вопроса. Если на этот вопрос уже был дан ответ, просто дайте мне знать, и я удалю его.

Ответы [ 3 ]

4 голосов
/ 14 марта 2010

Я рекомендую не пытаться "удаленных" объектов. Это опасная идея.

  1. У вас нет локального контроля над удаленным состоянием. Вы никогда не делаете.
  2. Попытка рассуждать о том, что такое «истинное» состояние, а что нет, очень быстро становится очень сложной.
  3. Мышление в терминах сообщений, скорее всего, приведет к созданию более «правильного» с точки зрения сети проекта, то есть к дизайну, который правильно распределяет обязанности и не делает неуместных предположений.
  4. Сетевое приложение на основе сообщений почти наверняка будет более надежным.
  5. Приложение, основанное на удаленном взаимодействии, обычно обеспечивает более быструю начальную разработку, но в конечном итоге приводит к дополнительным затратам времени на работу с граничными условиями и т. Д.

Действительно, не делай этого. Удаленные объекты просто плохие. На уровне ядра, сеть - это передача данных . Работа вашей программы с одной и той же моделью значительно облегчит вашу жизнь в долгосрочной перспективе.

3 голосов
/ 14 марта 2010

WCF действительно основан на сообщениях, удаленное взаимодействие все еще работает ... реальный вопрос: почему вы не хотите работать на основе сообщений?

2 голосов
/ 14 марта 2010

Если вы хотите использовать общий доступ к типам в WCF - например, то, что вы описали и использовали для удаленного взаимодействия, совместного использования объявлений (интерфейса) в общих сборках на сервере и клиенте - вы можете сделать это с помощью NetDataContractSerializer . Это помогло и другим .

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

Я должен добавить, что при правильном дизайне вы все равно получите приложение на основе контракта / сообщения даже с .Net Remoting . Ваши общие интерфейсы станут контрактами операций, в то время как ваши определения классов общих данных будут описывать контракты / сообщения данных, которые вы передаете.

...