在.NET-SQL Server应用程序中存储业务值的位置

在.NET-SQL Server应用程序中存储业务值的位置,.net,sql-server,design-patterns,application-design,web-application-design,.net,Sql Server,Design Patterns,Application Design,Web Application Design,这在开发人员中一直是一个鸡和蛋的问题。在哪里存储应用程序规则中使用的业务值。(在ASP.NET、窗口窗体或任何数据驱动的应用程序中) 我见过有人创建表,在表中存储文本和值表示,然后在代码中链接这些记录(通过ID或文本名称)。对我来说,这是最糟糕的方式: 您必须维护表并为每个表创建管理模块 每次需要访问业务价值时,您都会阅读该表 如果不预先填充数据库,应用程序将无法运行- 大多数开发人员告诉我这是“最佳实践”,我不买它,因为它不会比我将业务价值直接放在应用程序上的方法带来任何好处,比如: pu

这在开发人员中一直是一个鸡和蛋的问题。在哪里存储应用程序规则中使用的业务值。(在ASP.NET、窗口窗体或任何数据驱动的应用程序中)

我见过有人创建表,在表中存储文本和值表示,然后在代码中链接这些记录(通过ID或文本名称)。对我来说,这是最糟糕的方式:

  • 您必须维护表并为每个表创建管理模块
  • 每次需要访问业务价值时,您都会阅读该表
  • 如果不预先填充数据库,应用程序将无法运行-
大多数开发人员告诉我这是“最佳实践”,我不买它,因为它不会比我将业务价值直接放在应用程序上的方法带来任何好处,比如:

public enum SourceLocation { Database = 0, File = 1, UserInput = 3 } 公共枚举源位置 { 数据库=0, File=1, 用户输入=3 } 然后在从/到数据库的[Column]上使用整数,该数据库直接强制转换到数据对象上的Enum,因此逻辑可以直接表示:

if(DataObject.Column == SourceLocation.File) //Read From File if(DataObject.Column==SourceLocation.File) //从文件中读取 这解决了上述所有问题,但当您在应用程序之外的数据库上运行报表时,需要在SQL中转换这些值


所以我仍然在想,是否还有开发人员使用的另一个“更好”的解决方案或模式。我的意思是,每个数据驱动的应用程序都必须有一种解决这个问题的方法/设计,这个问题从一开始就存在了。

我不太确定我是否同意您的观点,将这些值存储在枚举中比将它们存储在某种外部数据源中能为您带来多大的好处

您必须维护表并为其创建管理模块 各

诚然,在外部数据源中存储值确实会增加一些体系结构开销。然而,如果您使用任何类型的ORM来处理数据访问和代码生成,这只是一个相当小的努力

我不确定你所说的“管理模块”是什么意思,但我将假设你指的是一个存储库,而不是一些供用户自己管理选项的界面。我不明白,如果备选方案是将值放入枚举中,为什么需要后者,因为用户自己也无法管理这些值

就“维护”表而言,您实际上不必像从枚举中添加或删除值那样进行更多的维护。正如John指出的,enum路由要求您重新构建和重新部署整个应用程序,而不是简单地从数据源添加或删除行。对我来说,这是一个更大的维护负担

每次需要访问业务价值时,您都会阅读该表

不正确,因为我假设这些值是相当静态的,所以在应用程序启动时缓存这些值并使用它们是非常简单的

如果不预先填充数据库,应用程序将无法运行

那又怎样?如果应用程序是数据驱动的,则需要将部署和配置数据库作为部署计划的一部分。在脚本中添加2个或3个
INSERT
语句会增加部署过程的复杂性吗

这解决了上述所有问题,但当您在上运行报告时 您需要翻译的应用程序之外的数据库 这些值都是SQL中的值

最重要的是,这是将这些值存储在外部的最有说服力的原因。考虑到这些值在报告中使用的事实,意味着它们的含义超出了应用程序的范围。这意味着,当其他地方需要这些知识时,您每次都必须复制这些知识。系统中的任何重复都会造成额外的维护负担,并增加在将来的更新中引入错误的机会

最后,枚举在数据绑定到UI元素时往往更加困难。如果可以,它们不允许向用户显示“漂亮”的值名称。相反,它们显示为下拉框,其中包含“UserStoredFile”和“PickandChooseANothernumValue”等项。除了将枚举值关联到单独的字符串(更多重复,请参见上段),没有办法克服枚举的这一限制

虽然这看起来没什么大不了的,但是任何一个优秀的开发者都应该关心像这样的小细节。关注整个用户体验非常重要。如果您不是特别注重细节,那么在UI之外的系统中可能还有很多其他地方也会出现问题。诚然,最后一点更像是一种主观的肥皂盒式的论点:)

我同意您的观点,仅存储这些值几乎不能证明向应用程序中添加数据库是合理的。但是,您会注意到,我通常会说外部数据源。没有理由不能设置应用程序从XML或其他类型的外部配置文件中提取这些值。然而,如果你已经拥有了数据库,你也可以把它保存在一个地方

编辑:

使用这些对象非常简单,它们只是集合。它们比枚举更自然地进行数据绑定,我认为在数据驱动的应用程序中,这一点很重要:

// Bind a collection of SourceLocation to an ASP.net dropdown list
ddlSourceLocations.Datasource = GetSourceLocations();
ddlSourceLocations.DataTextField = "LocationName";
ddlSourceLocations.DataValueField = "LocationId";
ddlSourceLocations.DataBind();
当然,正如您所提到的,使用enum肯定不可能做到这一点,只是它通常没有那么好

如果
SourceLocation
的概念需要超越名称和ID,那么通过将这些“业务价值”转换为完整的枚举对象还可以为未来提供更大的灵活性

让我们设想一下,稍后将一个“IsRemote”属性添加到SourceLocation中,以表示
if(myDataObject.SourceLocation.IsRemote) {
    // If the location is remote, do something extra   
}
var remoteLocations = GetSourceLocations().Where(x => x.IsRemote);