3

私の開発チームは設計上の問題に遭遇しました。誰かがアーキテクチャのこの部分を少しきれいにするのを手伝ってくれることを願っています.

私のシステムには、250 のメンバーを持つ列挙型があります [1 つのメンバーは個別のドロップダウンを表します]。特定のウィンドウにドロップダウンを設定するために、そのフォームは必要なドロップダウンに関連する列挙メンバーを送信し、ドロップダウン情報が返されます。

つまり、たとえば 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 ステートメントから切り離すことができます。次に、デリゲートを取得して実行し、ドロップダウン リストのデータを返すメソッドが 1 つあります。

于 2009-03-19T23:36:20.253 に答える
1

このような問題にはいくつかの解決策があります。

  1. Dictionary を使用して、ドロップダウンからデータにマップすることができます。

  2. このマッピング データをデータベースに移動することを検討することもできます。データの量は、この決定を正当化する可能性があります。

  3. 列挙型の形式で追加のキーを削除するには、ドロップダウンの名前をキーとして使用することを検討してください。

これは、関連する問題を扱い、同様の解決策を提案している非常に優れたブログです。

基本に戻る - If、For、Switch 後の生活 - 同様に、データ構造のリマインダー

于 2009-03-19T23:38:42.477 に答える
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 に答える
0

1 つのオプションは、リフレクションを使用して列挙値を処理することです。関連するすべてのクラスに一貫した命名基準がある場合、照会するテーブル/コレクションの名前と返す DTO の名前を動的に生成する方法があるかもしれません。機能させるには少し「オーバーヘッド」コードが必要ですが、一度実行すると、すべての異なるテーブルで機能する可能性があります。

于 2009-03-19T23:43:00.487 に答える