3

我的开发团队遇到了设计问题。我希望有人可以帮我清理一下架构的这一部分。

在我的系统中,我有一个包含 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 个单独的文件......)?还有另一种更有用的模式吗?仅仅拥有这个巨大的 switch 语句就变得难以管理。

任何帮助是极大的赞赏。提前致谢!

4

4 回答 4

4

您可以创建一个Dictionary<DropDownType, DropDownDtoDelegate>每个条目,其中包含一个枚举条目作为键和一个委托来检索下拉数据作为值。这将允许您将返回下拉列表的每个方法保持在巨大的 switch 语句之外。然后,您将有一种方法来检索委托、执行委托并返回下拉列表数据。

于 2009-03-19T23:36:20.253 回答
1

这些问题有一些解决方案。

  1. 您可以使用字典从下拉列表映射到您的数据。

  2. 您甚至可以考虑将此映射数据移动到数据库中。数据量可能证明这个决定是正确的。

  3. 要删除枚举形式的附加键,请考虑使用下拉列表的名称作为键。

这是一个非常好的博客,处理相关问题并提出类似的解决方案。

回归基础 - If、For 和 Switch 之后的生活 - 就像,数据结构提醒

于 2009-03-19T23:38:42.477 回答
0

一种选择可能是使用反射来处理枚举值。如果您对所涉及的所有类都有一致的命名标准,则可能有一种方法可以动态生成要查询的表/集合的名称和要返回的 DTO 的名称。它需要一些“开销”代码才能使其工作,但一旦你这样做,它可能适用于所有不同的表。

于 2009-03-19T23:43:00.487 回答
0

我将使用 DynamicMethod 在运行时为枚举中的每个项目生成代码。这应该缓存在字典中,并按需生成。

使用属性,您可以设置每个枚举上使用的实体,以及所需的这 2 个属性。

我可以想象这样的事情。

enum DropDownType
{
   [Configuration(Type = typeof(TableOne), DisplayNameProperty = "ColumnA", ValueProperty = "ColumnB")]
   T,

   [Configuration(Type = typeof(TableTwo), DisplayNameProperty = "ColumnC", ValueProperty = "ColumnD")]
   U
}

当你有一个枚举值时,你检查缓存方法的字典,如果不存在,你生成它。

使用反射您可以获得这些属性信息,并且通过一些 IL 技能,这可以轻松完成。

于 2009-03-20T05:27:00.253 回答