【问题标题】:How to handle a massive factory in a cleaner fashion如何以更清洁的方式处理大型工厂
【发布时间】:2010-10-14 10:44:12
【问题描述】:

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

在我的系统中,我有一个包含 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 语句就变得难以管理。

非常感谢任何帮助。提前致谢!

【问题讨论】:

    标签: c# design-patterns oop factory


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      Back to Basics - Life After If, For and Switch - Like, a Data Structures Reminder

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

          我可以想象这样的事情。

          enum DropDownType
          {
             [Configuration(Type = typeof(TableOne), DisplayNameProperty = "ColumnA", ValueProperty = "ColumnB")]
             T,
          
             [Configuration(Type = typeof(TableTwo), DisplayNameProperty = "ColumnC", ValueProperty = "ColumnD")]
             U
          }
          

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-06-06
            • 1970-01-01
            • 2022-10-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-06-02
            • 2011-06-22
            相关资源
            最近更新 更多