【问题标题】:database lookup table to enum or similar枚举或类似的数据库查找表
【发布时间】:2014-09-25 06:45:32
【问题描述】:

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

伪代码

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

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

【问题讨论】:

  • 我认为我的问题理解不正确。但是当我在数据库的自己的表中使用类型时,我会在 C# 中创建一个与之匹配的枚举。因此,如果在数据库中我有一个表“RegistrationType”,其中行“1,Admin”,“2,Moderator”......这些数字是表中的主键,所以我可以将它转换为 C# 为“enum : int {Admin = 1, Moderator = 2, ...},然后按照您的建议输入。

标签: c# asp.net database


【解决方案1】:

我相信为您的情况完成强类型枚举的唯一方法是代码生成。在编译时未生成的任何内容都不能用于强类型。

Robert Koritnik 发布了一个非常巧妙的方法:T4 template to Generate Enums

另一种“生成”可读性更好的枚举名称(以防万一)的方法是https://github.com/MehdiK/Humanizer 的 HUmanizer 项目。

【讨论】:

    【解决方案2】:

    从实际的角度来看,这似乎有点容易出错,并且您可能会觉得自己违反了一些良好的实践规则,因为没有集中访问该数据,并使其在维护期间面临不同步的风险,但是,从架构的角度来看,考虑到我们正在讨论查找数据,可以对其进行硬编码,因为它只是“静态数据合同”的一部分,如果你愿意的话。

    如果您确实有很多这些,那么也许可以将这些常量以一种格式放置,这样构建或数据库补丁脚本可以在这些值发生更改时更新它们,但十分之九只是将它们填充进去枚举工作正常。

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

    【讨论】:

      【解决方案3】:

      您可以在 c# 中使用 反射this answer 上有一个很好的例子来列出给定命名空间中声明的类。

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

      【讨论】:

        猜你喜欢
        • 2010-10-26
        • 1970-01-01
        • 1970-01-01
        • 2021-11-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多