如何以更清洁的方式处理大型工厂

时间:2009-03-19 23:24:05

标签: c# design-patterns oop factory

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

在我的系统中,我有一个包含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个单独的文件...)?还有其他模式更有用吗?只是拥有这个巨大的开关声明变得无法管理。

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

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

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

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

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

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

    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技能,可以轻松完成。