C #: Частичные классы и веб-сервисы: Разделение формы и функциональности - PullRequest
2 голосов
/ 22 октября 2008

Я увлекаюсь миром веб-сервисов и создаю простой веб-сервис, который имитирует математические операции. Сначала это было просто, передавая два целых числа, а затем к ним применялся бинарный оператор (плюс, минус и т. Д.) В зависимости от вызываемого метода.

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

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

Итак, я настроил два класса, как описано выше, но, похоже, он не работает, как мне сказали.

Возможно ли то, что я пытаюсь сделать? Если так, то где я иду не так?

Ответы [ 4 ]

2 голосов
/ 22 октября 2008

Частичные классы - это действительно инструмент для отделения автоматически сгенерированного кода от кода разработчика.

Хорошим примером является конструктор форм Windows в VS или новый код, сгенерированный DBML Linq DataContext.

Существует также аргумент в пользу их использования с поставщиками управления версиями в стиле VSS, где только один пользователь может редактировать файл одновременно.

Не стоит использовать их для логического разделения функциональности - существует только предварительная компиляция. Как только вы компилируете, вы получаете только один класс, но не тот, в котором легко отлаживать или отслеживать операции.

То, что вы описали, звучит как действительно хорошая ситуация для использования контрактов WCF. В этом случае и клиент, и сервер будут совместно использовать интерфейс (или интерфейсы).

Ваш сложный код пойдет туда и может быть протестирован отдельно, т.е. вне вашего подключенного приложения. Затем, когда найдены ошибки, вы можете быстро устранить проблемы с кодом и перейти к исследованию проблем, связанных с подключением.

0 голосов
/ 23 декабря 2009

(Этот поток, вероятно, мертв, но ...) Я думал о том, чтобы сделать нечто подобное, но с функциональностью (в моем случае) службы Windows.

Как клиентская программа, так и служба Windows нуждаются в доступе к данным, но только службе действительно нужно что-то делать с данными; они оба включены в dll, который содержит частичный класс, содержащий сжатые члены данных, однако я получаю сообщение об ошибке, говоря, что этот частичный класс конфликтует с частичным классом в моем сервисе, даже если они оба находятся в одном и том же пространстве имен частичный класс пуст.

0 голосов
/ 22 октября 2008

Как сказал Франци, он просто позволяет вам помещать отдельные части одного и того же класса в разные файлы.

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

Использование общей сборки также является хорошей идеей. Однако, если вы действительно хотите иметь возможность отправлять код с сервера на клиент, CSharpCodeProvider будет работать.

0 голосов
/ 22 октября 2008

Не с частичными занятиями. Частичный класс - это синтаксическая конструкция, которая позволяет вам иметь разные части класса в разных исходных файлах. Однако все части частичного класса в конечном итоге компилируются в один и тот же двоичный файл.

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

Вы также можете попробовать реализовать класс в общей сборке и использовать svcutil.exe / reference, чтобы импортировать его в клиентский прокси вместо того, чтобы иметь новое объявление в пространстве имен веб-службы.

...