Перечислимые типы как константы через веб-сервисы? - PullRequest
3 голосов
/ 02 октября 2008

Я работаю над проектом, в котором пытаюсь избежать жесткого кодирования идентификаторов БД в сервис-ориентированном проекте .NET. В некоторых случаях мне нужно для установки значений идентификаторов с помощью кода, но я не хочу просто жестко кодировать идентификаторы, так как я делал это раньше, и это приводит к кошмарам выравнивания БД при автоматическом увеличении Идентификаторы были изменены при сбросе БД в новую систему.

То, что я хочу сделать, - это создать перечисляемые константы, которые хранят идентификаторы так, чтобы в худшем случае обновлялся только 1 файл, если БД когда-либо изменялась, вместо того, чтобы пытаться пройти тысячи и тысячи строк кода заменить любой идентификатор в системе.

Это будет работать в одной системе, но в сервис-ориентированной среде моей компании перечисления не сериализуются с их значениями, а только с их именами.

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

EDIT
Я не совсем понял, о чем спрашиваю, поэтому уточню.

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

Наличие отдельной общей библиотеки не похоже на идеальное решение, так как я почти на стадии завершения этого проекта, и я буду хранить только 1 перечисление / класс в библиотеке. Кажется, что это пустая трата всего лишь на один урок.

Ответы [ 7 ]

1 голос
/ 02 октября 2008

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


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

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

1 голос
/ 02 октября 2008

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

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

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

Как упоминалось ранее, вы можете использовать WCF для отправки перечислений через WCF, но они очень хрупкие. Каждый раз, когда вы изменяете значения перечисления, вы будете вынуждены перекомпилировать сервис и обновлять ваши клиентские ссылки. Для открытых перечислений в WCF добавьте атрибут [DataContract] к классу и атрибут [EnumMember] для каждого члена. Вы были предупреждены.

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

Удачи.

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

Является ли код на другой стороне веб-службы c # или вам действительно нужно передавать целое число через Интернет?

Если у вас есть контроль над кодом с обеих сторон, вы можете просто передать enum и преобразовать его обратно в int, как только он пересечет провод.

(Int32)objectThatWasPassed.EnumerationValue;

Если у вас нет доступа к коду с другой стороны и вам нужно передать его как int, вы можете создать целочисленное свойство для всего, что вы передаете, и просто вызвать;

objectbeingPassed.ConstantProperty = (Int32)Whatever.Constant1;
0 голосов
/ 02 октября 2008

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

Это в основном позволяет вам определять enum на сервере и использовать его как на сервере, так и на клиенте, без суеты с общей библиотекой.

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

Вы можете написать enum на общей сборке и использовать его в своих приложениях.

Но я думаю, что обслуживание enum на веб-сервисе должно работать. У меня есть некоторые c # веб-сервисы с enum и на стороне клиента (php) мы передаем имя значения enum, и я получаю значение обычно на c #.

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

Вы можете определить перечисления в общей библиотеке и использовать их как на стороне клиента, так и на стороне сервера. Когда вы передаете enum через веб-сервис - он конвертируется в строку. Напишите простой метод расширения преобразования, который преобразует его в соответствующий enum. Пример:

DayOfWeek ConvertToDayOfWeek(this String str)
{
   return (DayOfWeek)Enum.Parse(typeof(DayOfWeek), str, true);
}

(Примечание. Я предполагаю, что у вас полнофункциональное клиентское / настольное приложение. Использует веб-сервис)

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