2009-05-28 1 views
1

このメソッドを汎用的にするには、助けが必要です。さまざまなWebリストコントロール(特定のコントロールで使用されているタイプに "MyType"を代入する)のリストを取得するのに約10回繰り返します。このメソッドを実行する

private static IList<MyType> GetList(RequestForm form) 
    { 
     // get base list 
     IMyTypeRepository myTypeRepository = new MyTypeRepository(new HybridSessionBuilder()); 
     IList<MyType> myTypes = myTypeRepository.GetAll(); 

     // create results list 
     IList<MyType> result = new List<MyType>(); 

     // iterate for active + used list items 
     foreach (MyType myType in myTypes) 
     { 
      if (myType.Active || form.SolutionType.Contains(myType.Value)) 
      { 
       result.Add(myType); 
      } 
     } 

     // return sorted results 
     result.OrderBy(o => o.DisplayOrder); 
     return result; 
    } 

この情報が十分でない場合は教えてください。私はこれが私がちょうど知り合っている高度な言語機能を必要とすると思う。たぶん私は彼らにすべて同じリポジトリを使用させるべきでしょうか?

ありがとうございました。

編集: ありがとうございました。私はピアサポートを持っていないので、このボードは素晴らしいですし、私はあなた一人一人から何かを学びました。私はすべての答えを受け入れることができたらいいと思う。

答えて

6

あなたは、まずこのようなあなたの関数は、もう少し簡潔にすることができます:

private static IList<MyType> GetList(RequestForm form) 
{ 
    // get base list 
    IMyTypeRepository myTypeRepository = 
     new MyTypeRepository(new HybridSessionBuilder()); 

    IList<MyType> myTypes = myTypeRepository.GetAll(); 

    return myTypes.Where(x => x.Active || form.SolutionType.Contains(x.Value)) 
        .OrderBy(x => x.DisplayOrder).ToList(); 
} 

その時点では、機能の内容のほとんどは直接MyTypeに関連しているので、あなたはさらに向上させることができますどのように大きく依存どのようにMyTypeが関係する他のタイプに関係するかについて。たとえば、ここにあなたの他のタイプは、合理的に見える(私には)契約に従った場合、あなたが書くことができる仮想的なバージョンは次のとおりです。すべての

private static IList<T> GetList(RequestForm form) where T : OrderedValueContainer 
{ 
    // we'll want to somehow genericize the idea of a TypeRepository that can 
    // produce these types; if that can't be done, we're probably better off 
    // passing a repository into this function rather than creating it here 

    var repository = new TypeRepository<T>(new HybridSessionBuilder()); 
    IList<T> myTypes = repository.GetAll(); 

    // the hypothetical OrderedValueContainer class/interface 
    // contains definitions for Active, Value, and DisplayOrder 

    return myTypes.Where(x => x.Active || form.SolutionType.Contains(x.Value)) 
        .OrderBy(x => x.DisplayOrder).ToList(); 
} 
+0

最初にこのメソッドをもっと簡潔にすることに感謝します。私は本当にそれが好きです。すべての型は、IWebControlインターフェイスを継承します。私はそれらのすべてが同じリポジトリを使うようにすることができると思う。 – Leslie

4

すべてのタイプが同じインターフェイスを実装している場合(作成しない場合は、このメソッドで必要なすべてのプロパティをインターフェイスに追加してください)、

private static IList<T> GetList(RequestForm form) 
     where T: IMyInterface 
    { 
     // get base list 
     IMyTypeRepository myTypeRepository = new MyTypeRepository(new HybridSessionBuilder()); 
     IList<T> myTypes = myTypeRepository.GetAll(); 

     // create results list 
     IList<T> result = new List<T>(); 

     // iterate for active + used list items 
     foreach (T myType in myTypes) 
     { 
      if (myType.Active || form.SolutionType.Contains(myType.Value)) 
      { 
       result.Add(myType); 
      } 
     } 

     // return sorted results 

     return result.OrderBy(o => o.DisplayOrder).ToList(); 
    } 

私が作ったもう1つの変更は、別の行にorderbyがあり、実際にはオーダーリストをキャプチャしていない最後の行です。

編集:すべてのリポジトリが実装もちろん仮定し

public static IMyTypeRepository GetRepository(Type t) 
{ 
    if(t == typeof(Type1)) 
    { 
     return Type1Repository(); 
    } 

    if(t == typeof(Type2)) 
    { 
     return Type2Repository(); 
    } 
    ....... 
} 

リポジトリ問題を解決するには、Tの種類に基づいて、正しいリポジトリを返し種類のリポジトリ工場を持つことができますIMyRepositoryインターフェイス。

+0

ご注文ありがとうございました。テストでそれほど遠かったわけではありません。 すべての型は同じインタフェースを実装していますが、独自のリポジトリを使用しています。私はそれらのすべてがこれのために同じリポジトリを使用するようにしなければならないでしょうか? – Leslie

+0

まあ、必ずしもそうではありません。 Tのタイプに基づいてリポジトリを作成する何らかのファクトリを持つことができます。「編集」を参照してください。 – BFree

1

リポジトリは共通のインターフェースを共有すると仮定すると、リポジトリと問題が解決するのは簡単でなければなりません:そのよう


public static IRepository RepositoryForType(Type t) 
{ 
    if(t == typeof(SomeClass)) 
     return new SomeClassRepository(new HybridSession()); 
    else if ... 
    else throw new InvalidOperationException("No repository for type " + t.Name); 
} 

として静的な関数を追加。これは、あなたの既存のコードへの変更の最小量を必要とすべきですしかし、将来このプロジェクトで新しいリポジトリを追加するときに、この関数で新しいリポジトリのクラスサポートを追加する必要があることに注意してください(単体テストを使用している場合は、このヘルパーを忘れたかどうかを簡単に把握できます)。

+0

このアイデアをありがとう。このインスタンスでは、すべてのWebコントロールで同じリポジトリを使用するほうがよいと思っています。特に、すべてが同じデータベーステーブルから来ているからです。 – Leslie

2

まず、すべてのタイプのようなプロパティを定義する共通interfaceを実装する必要があります。 ActiveValue ...

あなたは、このような一般的な方法を使用できるように、また、私が言うことができるもののために、独立しMyTypeのすべてのリポジトリのリポジトリインターフェースがなければなりません。 GetAll()メソッドはIRepositoryに定義する必要があります。

public interface IRepository<T> where T : IMyType 
{ 
    IList<T> GetAll(); 
} 

public class RepositoryFactory 
{ 
    public static IRepository<T> createRepository<T>(ISessionBuilder sb) where T : IMyType 
    { 
     // create repository 
    } 
} 

public interface IMyType 
{ 
    bool Active { get; } 
    string Value { get; } 
} 

private static IList<T> GetList(RequestForm form) where T : IMyType 
{ 
    // get base list 
    IRepository<T> repository = RepositoryFactory.createRepository<T>(new HybridSessionBuilder()); 
    IList<T> myTypes = repository.GetAll(); 

    // create results list 
    IList<T> result = new List<T>(); 

    // iterate for active + used list items 
    foreach (T myType in myTypes) 
    { 
     if (myType.Active || form.SolutionType.Contains(myType.Value)) 
     { 
      result.Add(myType); 
     } 
    } 

    // return sorted results 
    return result.OrderBy(o => o.DisplayOrder).ToList(); 
} 
+0

私は十分速く入力できません。私は全く同じものをタイプしていましたが、工場用のIoCコンテナを使用していました。 – Mark

関連する問題