跨网络服务使用枚举类型作为常量?

3
我正在开发一个项目,试图避免在.NET服务项目中硬编码数据库ID。有一些情况下我需要通过代码来设置ID值,但是我不想仅仅硬编码ID,因为我以前这样做过,当自动增量ID更改时,导致数据库对齐问题,尤其是在将数据库转移到新系统时。
我想要做的是创建一个枚举常量来存储ID,这样最坏的情况下,只需要更新1个文件,如果数据库发生变化,而不是尝试浏览成千上万行代码来替换系统中的任何ID。
这将适用于单个系统,但在我们公司的服务导向环境中,枚举不会序列化它们的值,只会序列化它们的名称。
分享Web服务中的ID的最佳方法是什么?我想使用枚举(理想情况)或某种常量,但我似乎无法做到这一点。我可以创建一个返回ID的Web方法,但是为每个ID发送Web请求,然后序列化响应并在客户端机器上反序列化听起来就像是一个糟糕的主意。
编辑: 我的问题没有讲清楚,所以我会详细说明。我想要一组常量。枚举仅被使用,因为它适当地将常量分组在一起。我主要是想知道是否有一种方法可以在Web服务中共享常量。我需要枚举所代表的值,而不是枚举本身。枚举从未作为整个实体在服务和客户端之间发送,除了作为整数。所有东西都以ID而不是枚举内部存储。拥有单独的共享库似乎不是理想的解决方案,因为我几乎已经完成了这个项目,并且只会在库中存储1个枚举/类。对于仅一个类来说,这似乎有点浪费。

使用枚举/常量的原因是为了防止其他代码更改这些值吗?而共享这些ID的原因是因为超过一个服务访问相同的数据库吗? 你能提供有关数据层的更多信息吗?难道没有一个中央服务来完成这项工作吗? - hurst
有一个中央数据库服务,但是有些情况下我需要为状态设置ID,而且我不想仅仅使用硬编码的数字,因为那显然很糟糕。我只需要一种在 Web 服务中共享常量整数的方法。 - Dan Herbert
你尝试过或者考虑使用数据契约吗? - hurst
7个回答

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

1

枚举类型本质上是一种本地数据类型,因此在服务之间共享它们不应该成为问题。但是您必须使用共享数据契约

我们使用枚举类型来进行小型查找列表,将令牌与数据库中的ID关联起来,然后我们还在服务之间共享数据契约(我们使用WCF)。这使我们能够在任何服务的代码中使用枚举令牌来引用相关的整数值。如果数据库中的值发生更改,我们将不得不手动更新枚举类型,但只需在一个地方 - 数据契约中进行更新。


另一个可能的解决方案是在需要ID的每个服务中创建缓存。在每个服务启动时,让它从中央数据服务获取值并以适当的方式存储。这可以是自定义缓存对象或静态字典。当您遇到重新编号问题时,只需重新启动服务即可。
我正在处理一个项目,在某些用户实体中进行了此操作,我们需要实际的ID,并希望避免不断调用数据服务,因为这些数据很少甚至永远不会改变。

0

您可以在共享程序集上编写枚举,并在您的应用程序中使用它。

但我认为在 Web 服务上提供枚举应该是可行的。我有一些带有枚举的C# Web服务,客户端(php)传递枚举值名称,在 C# 中我正常获取该值。


0
在您的 Web 服务项目中,只需创建一个公共枚举,并创建至少一个以该枚举作为返回类型的公共 Web 方法。在客户端项目中更新 Web 引用后,您可以在客户端代码中使用该枚举。
这样做基本上允许您在服务器上定义一个枚举,并在服务器和客户端上使用它,而无需处理共享库的麻烦。

这对我不起作用,因为枚举只存储与之关联的常量名称,如果您将其发布到 Web 服务上。 - Dan Herbert

0

你有几个选项可以做。你可以在单个类中定义一组常量,代表ID并帮助你在ID和对你更有用的内容之间进行转换。这样比较灵活,如果你想要变得更加高级,你甚至可以从数据库中查找一些你的魔术ID(如hurst的建议)。选择你想要发送值的类型,然后只需包装/忽略它是一个只读常量即可。

正如之前提到的,你可以使用WCF在WCF之间发送枚举,但它们非常脆弱。每当你更改枚举值时,你将被迫重新编译服务并更新客户端引用。要在WCF中公开枚举,请向类添加[DataContract]属性,向每个成员添加[EnumMember]属性。你已经被警告了。

之前的一些建议提到要使用共享的值。这是强烈建议的,这样你只需要管理它并更新它一次。在这种情况下,非常非常非常(我说得很清楚吗?)重要的是确保每个人都使用共享的值,而不是直接使用值。

祝你好运。


0

您可以在公共库中定义枚举,并在客户端和服务器端使用它。

当您通过 Web 服务传递枚举时,它会被转换为字符串。编写一个简单的转换扩展方法,将其转换为适当的枚举。例如:

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

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

但这不是我想做的。我想使用枚举来存储常量整数。名称并不重要(除了描述性)。它们代表的值才是重要的。 - Dan Herbert

0

另一端的webservice代码也是C#吗?还是你实际上需要通过网络传递整数?

如果你可以控制两端的代码,你可以直接传递枚举类型,并在数据传输后将其转换回整数。

(Int32)objectThatWasPassed.EnumerationValue;

如果您无法访问另一侧的代码并需要将其作为整数传递,则可以在要传递的任何内容上创建一个整数属性,然后只需调用;

objectbeingPassed.ConstantProperty = (Int32)Whatever.Constant1;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接