在web服务中将类型枚举为常量

本文关键字:枚举 常量 类型 web 服务 | 更新日期: 2023-09-27 17:48:54

我正在做一个项目,我试图避免在中对DB ID进行硬编码。NET面向服务的项目。在某些情况下,我需要通过代码设置ID值,但我不想只对ID进行硬编码,因为我以前也这样做过,当数据库转储到新系统时,自动递增的ID发生了更改,这会导致数据库对齐噩梦。

我想做的是创建一个枚举常量来存储ID,这样在最坏的情况下,如果数据库发生更改,只需要更新一个文件,而不是试图通过成千上万行代码来替换系统中的任何ID。

这将在单个系统上工作,但在我公司面向服务的环境中,枚举不会序列化它们的值,只序列化它们的名称。

在web服务中共享ID的最佳方式是什么?我想以某种方式使用枚举(理想的情况)或常量,但我似乎无法做到这一点。我可以制作一个返回ID的web方法,但为每个ID发送一个web请求,然后在客户端机器上序列化响应和反序列化,听起来是个坏主意。

编辑
我不完全清楚我在问什么,所以我会详细说明。

我想要一组常数。只能使用枚举,因为它将常量适当地分组在一起。我主要感兴趣的是看看是否有一种方法可以在web服务中共享常量。我需要枚举表示的值,而不是枚举本身。除非是整数,否则从不在服务和客户端之间发送枚举。在内部,所有内容都存储为ID,而不是枚举。

拥有一个单独的共享库听起来不是理想的解决方案,因为我几乎已经到了这个项目的完成点,而且我只会在库中存储1个enum/class。只上一节课似乎有点浪费。

在web服务中将类型枚举为常量

我一直创建一个单独的程序集,其中包含枚举和客户端/服务器需要共享的任何接口。然后,您可以从客户端和服务器引用它,而不会泄露任何功能。

枚举作为本机数据类型本质上是可序列化的,因此在服务之间共享它们应该不会有问题。但是您必须使用共享数据合约。我们将枚举用于将令牌与数据库中的ID关联的小型查找列表,但随后我们也在服务之间共享数据契约(我们使用WCF)。这允许我们使用枚举令牌来引用任何服务的代码中的相关整数值。如果数据库中的值发生变化,我们将不得不手动更新枚举,但只能在一个地方更新——数据契约。


另一种可能的解决方案是在每个需要ID的服务中创建一个缓存。在每个服务启动期间,让它从中央数据服务获取值,并以适当的方式存储。这可以是一个自定义缓存对象,也可能是一个静态字典。遇到重新编号问题时,只需重新启动服务即可。

我在一个项目中工作,在这个项目中,这是为某些用户实体完成的,在这些用户实体中,我们需要实际的ID,并希望避免不断地调用数据服务,以获得不会发生太大变化的东西。

您可以在公共库中定义枚举,并在客户端和服务器端使用它。当您通过web服务传递enum时,它会被转换为字符串。编写一个简单的转换扩展方法,将其转换为适当的枚举。示例:

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

(注意:我假设你有丰富的客户端/桌面应用程序。使用web服务)

你可以在共享程序集上编写enum并在应用程序中使用它。

但我认为在webservice上提供enum应该有效。我有一些带有enum的c#Web服务,在客户端(php),我们传递enum值名称,我通常在c#获得值。

只需在Web服务项目中创建一个公共枚举,并至少创建一个使用该枚举作为返回类型的公共WebMethod。在更新客户端项目中的web引用后,您也可以在客户端代码中使用该枚举。

这基本上允许您在服务器上定义一个枚举,并在服务器和客户端上使用它,而无需使用共享库。

web服务的另一端的代码也是c#吗?还是您实际上需要在web上传递整数?

如果你对两边的代码都有控制权,你只需要传递枚举,并在它越界后将其转换回int。

(Int32)objectThatWasPassed.EnumerationValue;

如果你不能访问另一端的代码,并且需要将其作为int传递,你可以在传递的任何内容上创建一个integer属性,然后调用;

objectbeingPassed.ConstantProperty = (Int32)Whatever.Constant1;

有几个选项可以供您选择。您可以在一个表示ID的类中定义一组常量,这些常量可以帮助您在ID和对您更有用的东西之间进行转换。这是适度灵活的,如果你想得到真正的幻想,你甚至可以从数据库中查找一些你的魔法id(根据赫斯特的建议)。选择要发送值的类型,然后只包装/忽略它是只读常量的事实。

如前所述,您可以使用WCF跨WCF发送枚举,但它们非常脆弱。任何时候更改枚举值,都将强制重新编译服务并更新客户端引用。若要在WCF中公开枚举,请将[DataContract]特性添加到类,并将[EnumMember]特性添加给每个成员。您已收到警告。

前面的一些建议提到了使用一组共享的值。强烈建议您这样做,以便您只需管理它并更新一次。在这种情况下,确保每个人都使用共享的一组值,而不是直接使用这些值,这是非常非常重要的(我说过非常重要吗?)。

祝你好运。