如何更加清洁地管理大型工厂

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个单独文件...)?是否有其他更有用的模式?仅仅使用这个巨大的开关语句已经变得难以管理。

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

4个回答

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

1

这类问题有些解决方案。

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

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

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

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

回到基础 - 如果,对于和开关之后的生活 - 像,一个数据结构的提醒


0

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

通过一个属性,您可以设置用于每个枚举的实体以及所需的两个属性。

我可以想象出类似于以下的东西。

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

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

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

使用反射获取这些属性信息,并结合一些IL技巧,这可以很容易地完成。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接