您将如何引用查找/元数据
本文关键字:查找 元数据 引用 何引用 | 更新日期: 2023-09-27 17:48:53
我遇到过很多次这个问题,从来都不喜欢所选择的解决方案。假设数据库中有一个状态列表(只是一个简单的例子)。在代码隐藏中,您希望能够通过ID引用State,并通过Intellisense获得它们的列表。
例如:
States.Arizona.Id //returns a GUID
但问题是我不想硬编码GUID。现在,在过去,我已经完成了以下所有工作:
创建类常量(最糟糕的硬编码…呃!)
创建具有ID属性(以及其他属性)的查找类(仍然是硬编码的,如果更新,则需要重建项目)
将所有GUIDS放入.config文件中,创建一个枚举,然后在静态构造函数中将GUIDS从.config加载到以枚举项为键的哈希表中。那么我可以做:
StateHash[StatEnum.Arizona]
。很好,因为如果GUID发生更改,则不需要重新生成。但是,如果添加了新记录或删除了旧记录,则没有帮助,因为需要更新枚举。
所以我想问的是,是否有人有更好的解决方案?理想情况下,我希望能够通过Intellisense进行查找,而不必在有更新时重新生成代码。甚至不确定这是可能的。
编辑:使用状态只是一个例子(可能很糟糕)。如果有帮助的话,它可以是一个小部件、汽车类型等的列表。
就我个人而言,我会将查找数据存储在数据库中,并尽量避免将规则绑定到单个状态之类的硬编码类型。也许是这些州的一些关键属性(比如.ApplyDoubleTax或其他什么)。非逻辑代码不需要使用intellisense——它通常只需要列出它们或按名称查找,无论你存储了什么,这都可以很容易地完成
同样,我会加载一次数据并缓存它
可以说,对状态的逻辑进行编码是硬编码-尤其是如果你想很快走向国际-当一个网站问我住在哪个州时,我讨厌…
正在更改数据。。。美国希望在短期内吞并美国吗?
我相信,如果它出现在Intellisense中,那么根据定义,它是硬编码到程序中的。
也就是说,如果您的目标是使硬编码尽可能无痛,那么您可以尝试根据数据库中的内容自动生成枚举。也就是说,您可以编写一个程序来读取数据库并创建一个包含枚举的FOO.cs文件。然后只要在每次数据更改时运行该程序即可。
这迫切需要一个自定义MSBuild任务。在这种情况下,您确实需要一个自动生成的枚举或类;如果ID来源于数据库并且可以/将要更改并且不容易预测。然后,您可以将该任务放入项目中,并在每次生成之前根据需要进行更新。
或者开始查看ORMs:)