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