繁体   English   中英

枚举或类似的数据库查找表

[英]database lookup table to enum or similar

我正在使用查找表作为参考。 例如注册类型,管理员,主持人,然后使用工厂来确定注册类型。 创建比较注册的强类型方法的最简单方法是什么。 类似于枚举的行为。 例如

伪代码

class regfactory
{
    case()        
        if(regType.Admin: return new adminReg()      
}

我能想到的唯一方法是从数据库生成的魔术字符串字典。

我认为,针对您的情况来完成强类型枚举的唯一方法是代码代码生成。 编译之前未生成的任何内容都不能用于强类型化。

罗伯特·科里特尼克(Robert Koritnik)发布了一种非常巧妙的方法: T4模板来生成枚举

生成“更好”的可读枚举名称(如果需要的话)的另一种方法是位于https://github.com/MehdiK/Humanizer的HUmanizer项目。

从实际的角度看,这似乎有点容易出错,并且您可能感觉要违反一些良好的操作规则,即不对数据进行集中访问,而使数据在维护过程中处于不同步的风险中。从架构的角度来看,考虑到我们在谈论查找数据,因此可以对其进行硬编码,因为如果您愿意的话,它只是“静态数据合同”的一部分。

如果确实有很多常量,那么可能会出现这样的情况:将这些常量放入格式,即当这些值更改时,构建或数据库补丁脚本可以更新它们,但是十分之九只是将它们填充在枚举中精细。

值得注意的是,某些ORM确实对枚举有很好的支持,包括EF,如果您采用代码优先方法,EF将允许使这些值保持同步。 但是,我们正在谈论的是在您的软件中添加一个全新的层,因此您有更多的理由,而不仅仅是想要保持静态查找数据同步以实现这一目的。

您可以在c#中使用反射 这个答案有一个很好的例子,可以在给定的命名空间中列出已声明的类。

然后,您可以将注册类型的名称与可用类的名称进行比较,以确定要实例化的类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM