Моя дилемма заключается в том, как разделить перечисление между двумя приложениями.
Пользователи загружают документы через внешнее приложение, которое находится в Интернете. Это приложение вызывает веб-сервис внутреннего приложения и передает ему документ. Внутреннее приложение сохраняет документ и вставляет строку в таблицу Document.
Тип документа (7 возможных типов документов: Invoice, Contract и т.д.) передается в качестве параметра в метод UploadDocument веб-сервиса. Вопрос заключается в том, каким должен быть тип (и возможные значения) этого параметра?
Поскольку в обоих приложениях необходимо жестко кодировать эти значения, то, на мой взгляд, вполне можно использовать описательную строку (Invoice, Contract, WorkOrder, SignedWorkOrder).
Может быть, лучше создать перечисление DocumentTypes в первом приложении, воспроизвести его и во втором, а затем передавать соответствующее целочисленное значение веб-сервису между ними?
Я по-прежнему буду использовать перечисление для внутренних целей, но буду ожидать, что потребители будут передавать мне только имя, а не само числовое значение.
Просто глупый пример для иллюстрации:
public enum DocumentType
{
Invoice,
Contract,
WorkOrder,
SignedWorkOrder
}
[WebMethod]
public void UploadDocument(string type, byte[] data)
{
DocumentType docType = (DocumentType)Enum.Parse(typeof(DocumentType), type);
}
Я бы не рекомендовал передавать между ними целое число, просто для удобства чтения и отладки. Скажем, вы просматриваете свои журналы и видите кучу 500 ошибок для DocumentType=4. Теперь вам придется искать, какой DocumentType равен 4. Или если одно из приложений ссылается на число, которого нет в другом, возможно, из-за несовпадения версий.
Это немного больше кода, и это немного натирает мозги статической типизацией, но в протоколах поверх HTTP мудрость заключается в том, что нужно выбирать разборчивые строки, а не непрозрачные перечисления.
В.NET ценности перечисления (по умолчанию) преобразованы в последовательную форму в xml с именем. Для случаев, где у Вас может быть несколько ценностей ([флаги] (http://msdn.microsoft.com/en-us/library/system.flagsattribute.aspx)), тогда это помещает пространство между ценностями. Это работает потому что перечисление doesn' t содержат места, таким образом, Вы можете получить стоимость снова, разделив последовательность (т.е. " Контракт Счета SignedWorkOrder" используя lubos' s пример).
Вы можете управлять преобразованием в последовательную форму ценностей в asp.net веб-сервисах, используя [XmlEnumAttribute] (http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlenumattribute.aspx), или используя [EnumMember] (http://msdn.microsoft.com/en-us/library/system.runtime.serialization.enummemberattribute.aspx) признак, используя WCF.
Я могу говорить только о .net, но если у вас есть ASP.net Webservice, то вы должны иметь возможность добавить перечисление непосредственно в него.
Когда вы затем используете команду "Добавить веб-ссылку" в своем клиентском приложении, полученный класс должен включать это перечисление
Но это только мои мысли, я уверен, что делал это в прошлом, но не могу сказать точно.
Если Вы не работаете с.NET к.NET МЫЛУ, Вы можете все еще определить счетчик, если обе конечных точки используют WSDL.
<s:simpleType name="MyEnum">
<s:restriction base="s:string">
<s:enumeration value="Wow"/>
<s:enumeration value="This"/>
<s:enumeration value="Is"/>
<s:enumeration value="Really"/>
<s:enumeration value="Simple"/>
</s:restriction>
</s:simpleType>
До WSDL-> инструмент генератора По доверенности, чтобы разобрать это в enum эквивалент на языке клиента.
Есть некоторые довольно серьезные основания для того, чтобы не использовать 'enum's на интерфейсной границе как этот. Рассмотрите [Dare' s почта] (http://www.25hoursaday.com/weblog/2005/08/31/WhyYouShouldAvoidUsingEnumeratedTypesInXMLWebServices.aspx) на предмете.
I' ve заметил это, используя " Добавьте Обслуживание Reference" в противоположность " Добавьте сеть Reference" от VS.net фактические ценности enum сталкиваются, а также имена enum. Это действительно раздражающее, поскольку я должен поддержать и 2,0 и 3,5 клиентов. Я заканчиваю тем, что имел необходимость войти в 2,0 произведенных кодекса полномочия веб-сервиса и вручную добавить, что enum оценивает каждый раз, когда я вношу изменение!