我遇到过这个问题很多次,从不喜欢选择的解决方案。假设您在数据库中有一个状态列表(仅作为一个简单示例)。在您的代码隐藏中,您希望能够通过ID引用状态,并通过Intellisense提供它们的列表。
例如:
States.Arizona.Id //returns a GUID
但问题是我不想硬编码GUIDS。现在,我已经完成了以下所有工作:
创建类常量(最糟糕的硬编码......呃!)
创建具有ID属性的Lookup类(以及其他)(仍然是硬编码的,如果需要更新则需要重建项目)
将所有GUID放入.config文件,创建枚举,并在静态构造函数中将.config中的GUID加载到Hashtable中,并使用枚举项作为键。那么我可以这样做:StateHash[StatEnum.Arizona]
。很好,因为如果GUID更改,则不需要重建。但是,如果添加新记录或删除旧记录,则无效,因为需要更新枚举。
所以我问的是,如果有人有更好的解决方案吗?理想情况下,我希望能够通过Intellisense查找,而不必在有更新时重建代码。甚至不确定是否可能。
编辑:使用状态只是一个例子(可能是坏的)。如果有帮助,它可以是小部件,汽车类型等的列表。
答案 0 :(得分:1)
就个人而言,我会将查找数据存储在数据库中,并且只是试图避免将规则绑定到各个状态之类的硬编码类型。也许某些关键属性 那些状态(如.ApplyDoubleTax或其他东西)。非逻辑代码不需要使用intellisense - 它通常只需要列出它们或按名称查找,这可以很容易地完成,但是你已经存储了它。
同样,我会加载数据并缓存它。
可以说,针对状态的逻辑编码是硬编码 - 特别是如果你想很快去国际 - 当网站问我生活的状态时,我讨厌在...
重新改变数据......美国是否希望尽快兼并?
答案 1 :(得分:0)
这会引发自定义MSBuild任务。在这种情况下,你真的想要一个自动生成的枚举或类;如果ID来自数据库并且可以/将会改变,并且不容易预测。然后,您可以将任务放在项目中,并在必要时在每次构建更新之前运行。
或者开始查看ORM:)
答案 2 :(得分:0)
我相信如果它出现在Intellisense中,那么根据定义,它会被硬编码到你的程序中。
也就是说,如果您的目标是使硬编码尽可能轻松,那么您可能尝试的事情是根据数据库中的内容自动生成枚举。也就是说,您可以编写一个读取数据库的程序,并创建一个包含枚举的FOO.cs文件。然后每次数据更改时运行该程序。