在为现有应用程序编写代码时,开发数据库环境通常与生产环境不匹配 - 更糟糕的是,有时候覆盖环境只是一种选择。
我想到的所有环境代码的一个想法是使用数据绑定枚举,其值将绑定到它们所代表的数据项的ID。我无法使用Enum
,但我能够通过抽象类来解决它。例如:
public abstract class Colors
{
private static readonly string c_red = "red";
private static readonly string c_blue = "blue";
private static readonly string c_yellow = "yellow";
private static readonly string c_green = "green";
private static int? _red = null;
private static int? _blue = null;
private static int? _yellow = null;
private static int? _green = null;
public static int Red
{
get
{
if (_red == null)
_red = GetColorID(c_red);
return (int)_red;
}
}
public static int Blue
{
get
{
if (_blue == null)
_blue = GetColorID(c_blue);
return (int)_blue;
}
}
public static int Yellow
{
get
{
if (_yellow == null)
_yellow = GetColorID(c_yellow);
return (int)_yellow;
}
}
public static int Green
{
get
{
if (_green == null)
_green = GetColorID(c_green);
return (int)_green;
}
}
private static int GetColorID(string identifier)
{
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Demo"].ConnectionString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("spGetColorId", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("Name", identifier);
return Convert.ToInt32(cmd.ExecuteScalar());
}
}
}
}
通过这种方式,我可以在此示例中调用Colors.Red
来获取Red的ID,无论我是在Dev,Testing还是Production。
我的问题是:这真的是实现这一目标的理想方法吗?是否存在数据绑定枚举的本地到C#方法,或类似于我上面所做的事情?
答案 0 :(得分:0)
拥有枚举意味着值很少(如果有的话)发生变化。您可以将其视为一个封闭的值列表(如一周中的几天等)。
由于枚举的这种性质,我觉得可以接受这样的冗余:枚举基础值被指定两次(一次在DB中,另一次在枚举本身中)。
如果您担心出现差异,可以在应用程序启动时对值进行验证,并检查值是否具有正确的对应ID,以及枚举中的值数是否与数据库中的值数相匹配。