我的开发团队遇到了设计问题。我希望有人可以帮我清理一下这部分架构。
在我的系统中,我有一个包含250个成员的枚举[一个成员代表一个明显的下拉列表]。为了填充任何给定窗口的下拉列表,该表单将发送与所需下拉列表相关的枚举成员,并返回下拉信息。
换句话说,例如,我们有3个窗口。窗口A有下拉X,Y和Z.窗口B有下拉W,X和Y,窗口C有下降T,U和W.我的DropDownType枚举由T,U,W,X,Y,Y组成和Z.所以对于指定的窗口,给定该窗口的下拉列表,我查询数据是否出现在那些下拉列表中。
这是一个简化的例子,因为我的应用程序包含> 250个明显的下降。
您可以想象,我有一个工厂设置来返回每个下拉列表的数据。并且要求每个下拉请求此工厂。
switch (dropDownType)
{
case DropDownType.T:
return (from t in dataContext.GetTable<TableOne>()
select new DropDownDto
{
DropDownDisplayName = t.ColumnA,
DropDownValue = t.ColumnB
}).ToList();
case DropDownType.U:
return (from u in dataContext.GetTable<TableTwo>()
select new DropDownDto
{
DropDownDisplayName = u.ColumnC,
DropDownValue = u.ColumnD
}).ToList();
// etc...
}
由于我在这个枚举中有这么多成员,有没有人知道更优雅的编码方式?您认为将其转换为工厂方法会有所帮助(但是我们必须在源代码中担心250个单独的文件...)?还有其他模式更有用吗?只是拥有这个巨大的开关声明变得无法管理。
非常感谢任何帮助。提前谢谢!
答案 0 :(得分:4)
您可以创建一个Dictionary<DropDownType, DropDownDtoDelegate>
,其中每个条目都包含一个枚举条目作为键,并且委托将检索下拉数据作为值。这将允许您保持每个返回下拉列表的方法与大型switch语句分开。然后,您将有一个方法来检索委托,执行它,并返回下拉列表数据。
答案 1 :(得分:1)
这些问题有一些解决方案。
您可以使用词典从下拉列表映射到数据。
您甚至可以考虑将此映射数据移动到数据库中。数据量可能只是这个决定。
要删除枚举形式的附加键,请考虑使用下拉列表的名称作为键。
这是一个非常好的博客,处理相关问题并提出类似的解决方案。
Back to Basics - Life After If, For and Switch - Like, a Data Structures Reminder
答案 2 :(得分:0)
一个选项可能是使用反射来处理枚举值。如果您对所涉及的所有类都有一致的命名标准,则可能有一种方法可以动态生成要查询的表/集合的名称以及要返回的DTO的名称。它需要一些“开销”代码才能使它工作,但是一旦你这样做,它可能适用于所有不同的表。
答案 3 :(得分:0)
我会使用DynamicMethod在运行时为枚举中的每个项生成代码。 这应该缓存在字典中,并按需生成。
使用属性,您可以设置每个枚举上使用的实体,以及所需的2个属性。
我可以想象这样的事情。
enum DropDownType
{
[Configuration(Type = typeof(TableOne), DisplayNameProperty = "ColumnA", ValueProperty = "ColumnB")]
T,
[Configuration(Type = typeof(TableTwo), DisplayNameProperty = "ColumnC", ValueProperty = "ColumnD")]
U
}
当你有一个枚举值时,检查缓存方法的字典,如果不存在,则生成它。
使用反射可以获得这些属性信息,并且通过一些IL技能,可以轻松完成。