将类型枚举为Web服务中的常量?
我正在一个项目中尝试避免在面向.NET服务的项目中对DB ID进行硬编码。在某些情况下,我需要通过代码设置ID值,但是我不想仅仅对ID进行硬编码,因为我之前已经这样做过,并且当DB更改了自动递增ID时,这会导致DB对齐噩梦被转储到新系统。
我想做的是创建一个存储ID的枚举常量,这样在最坏的情况下,如果更改了数据库,则只需要更新1个文件,而不是尝试遍历数千行代码来替换任何内容。系统中的ID。
这将在单个系统上运行,但是在我公司面向服务的环境中,枚举不随其值序列化,而仅随其名称序列化。
跨Web服务共享ID的最佳方法是什么?我想以某种方式使用枚举(理想情况)或者常量,但似乎无法使它正常工作。我可以制作一个返回ID的Web方法,但是发送每个ID的Web请求,然后在客户端计算机上序列化响应和反序列化听起来像是个坏主意。
编辑
我不清楚我要问的是什么,所以我会详细说明。
我想要一组常量。只能使用枚举,因为它将常量适当地组合在一起。我主要感兴趣的是查看是否有一种方法可以在Web服务之间共享常量。我需要枚举表示的值,而不是枚举本身。枚举永远不会在服务和客户端之间发送,除非是整数。在内部,所有内容都存储为ID,而不是枚举。
拥有一个单独的共享库听起来并不理想,因为我快要完成该项目了,而且我只会在该库中存储1个枚举/类。只上一堂课似乎有点浪费。
解决方案
我们可以在公共库中定义枚举,并在客户端和服务器端使用它。
DayOfWeek ConvertToDayOfWeek(this String str) { return (DayOfWeek)Enum.Parse(typeof(DayOfWeek), str, true); }
当我们通过Web服务传递枚举时,它将转换为字符串。编写一个简单的转换扩展方法,将其转换为适当的枚举。例子:
(注意:我假设我们有使用网络服务的富客户端/桌面应用程序。)
我总是创建一个单独的程序集,其中包含枚举和客户端/服务器需要共享的所有接口。然后,我们可以从客户端和服务器两者中引用它,而不会泄漏任何功能。
我们可以在共享程序集上编写枚举,然后在应用程序中使用它。
但是我认为在Web服务上提供枚举应该有效。我有一些带有枚举的cwebservices,在客户端(php),我们传递枚举值名称,并且我通常在c#中获得值。
只需在Web服务项目中创建一个公共枚举,然后至少创建一个使用该枚举作为其返回类型的公共WebMethod。在客户端项目中更新Web参考之后,我们也可以在客户端代码中使用该枚举。
基本上,我们可以在服务器上定义一个枚举,并在服务器和客户端上都使用它,而不必费心使用共享库。
枚举本质上可序列化为本机数据类型,因此跨服务共享它们应该不是问题。但是我们必须使用共享数据协定。
我们将枚举用于将令牌与数据库中的ID关联的小型查找列表,但随后我们还共享服务之间的数据协定(我们使用WCF)。这使我们可以使用枚举令牌来引用任何服务代码中的关联整数值。如果数据库中的值发生更改,我们将必须手动更新枚举,但只能在一个数据协定中进行。
另一种可能的解决方案是在每个需要ID的服务中创建一个缓存。在启动每个服务期间,请它从中央数据服务中获取值并以适当的方式进行存储。这可以是自定义缓存对象,也可以是静态字典。遇到重新编号问题时,只需重新启动服务即可。
我正在做一个项目,该项目是为某些需要实际ID的用户实体完成的,并且希望避免不断调用数据服务以获取不会发生太大变化的内容。
Web服务cas另一侧的代码是否正确,或者我们实际上是否需要在Web上传递整数?
(Int32)objectThatWasPassed.EnumerationValue;
如果我们对双方的代码都拥有控制权,则只要传递枚举并将其跨过导线,即可将其转换回int类型。
objectbeingPassed.ConstantProperty = (Int32)Whatever.Constant1;
如果我们无权访问另一侧的代码并需要将其作为int传递,则可以在传递的任何内容上创建一个integer属性,然后调用它;
有几种我们想做的选择。我们可以在代表ID的单个类中定义一组常量,这些常量可以在ID和对我们更有用的内容之间进行转换。这具有一定的灵活性,如果我们真的想花哨的话,甚至可以从数据库中查找一些魔术ID(根据hurst的建议)。选择我们要发送值的类型,然后只包装/忽略它是一个只读常量的事实。
如前所述,我们可以使用WCF在WCF之间发送枚举,但是它们非常脆弱。每当我们更改枚举值时,都将被迫重新编译服务并更新客户端引用。要在WCF中公开的枚举,请将[DataContract]属性添加到类中,并将[EnumMember]属性添加到每个成员中。你被警告了。
前面提到的一些建议是使用一组共享的值。强烈建议这样做,以便我们只需对其进行一次更新即可对其进行管理。在这种情况下,确保每个人都使用共享的值集而不是直接使用值是非常非常非常重要的(我说得非常吗?)。
段落数量不匹配