2011-08-15 7 views
4

私はこのような多くの方法があります:EF4のコンテキスト作成

public IEnumerable<Director> GetAllDirectors() 
    { 
     using (var dbContext = new BodModelContainer()) 
     { 
      return dbContext.Members.OfType<Director>().ToList(); 
     } 
    } 

..orこれを...

public Member GetMemberById(int memberId) 
    { 
     using(var dbContext = new BodModelContainer()) 
     { 
      return dbContext.Members.Find(new[] {memberId}); 
     } 
    } 

またはその:

public SomeType GetOrDoSomethingWithDbBySomethingElse(T1 t1var, T2, T2 var, ...) 
    { 
     using(var dbContext = new BodModelContainer()) 
     { 
      return dbContext.SomeType.DoSomething(); 
     } 
    } 

は、だから私は、再編成したいですこれらの方法はすべて次のようなものです。

// create db context here 
    public void InDb(Func<BodModelContainer, out SomeGenericType???> workingWithDb) 
    { 
     using(var dbContext = new BodModelContainer()) 
     { 
      workingWithDb(dbContext); 
     } 
    } 

    // using it like 
    public Member GetMemberById(int memberId) 
    { 
      InDb((dbContext) => 
      { 
        return dbContext.Members.Find(new[] { memberId }); 
      }); 
    } 

質問は:そのような一般的なInDb方法を作るためにどのように、あなたが記述しているように見える実際の問題は、あなたがの戻り値の型を設定する方法を見つけ出すことができないという事実であるSomeGenericType???

+0

これは読めない抽象度のように見える – Eranga

+0

Eranga、いくつかのソースが編集されました。今はもっと読みやすいですか?それとも悪い考えですか? –

答えて

3

ものですFunc<>。このジェネリックを作成するには、InDbにジェネリックタイプも必要とする必要があります。

public TRet InDb<TRet>(Func<BodModelContainer, TRet> workingWithDb) { 
    TRet ret = default(TRet); 
    using (var dbContext = new BodModelContainer()) { 
    ret = workingWithDb(dbContext); 
    } 
    return ret; 
} 

public Member GetMemberById(int memberId) { 
    return InDb(dbContext => { return dbContext.Members.Find(new[] { memberId }); }); 
} 

は、(すべてのコードはここにテストされていない)動作するはずです、または匿名メソッドを使用して、あなたはローカル変数を持っていると.NETは、すべての厄介な仕事を作ることができます。もちろん

public void InDb(Action<BodModelContainer> workingWithDb) { 
    using (var dbContext = new BodModelContainer()) { 
    workingWithDb(dbContext); 
    } 
} 

public Member GetMemberById(int memberId) { 
    Member member; 
    InDb(dbContext => { member = dbContext.Members.Find(new[] { memberId }); }); 
    return member; 
} 

リダイレクト/このレベルの抽象化が有用であるならば、これはすべて言われて、私は知らない - あなたは少し知覚ゲイン(もしあれば)と、それは少し複雑作っています。多くの作業が設定されている場合を除き、dbContextInDbで使用されていますが、それは非常に参考にならないと思います。

+1

Drat - あなたは私にそれを打つ。私の答えはあなたのものと本質的に同じなので、私はそれを削除しました。しかし、私はこの種のものは非常に便利だと思う、私はいつもそれを行う。それは(複雑かつ繰り返しの)セットアップ/ティアダウンコードを抽象化し、メンバーを見つけるコードの構文だけを扱うことにしましょう。同じコードの繰り返しコードを見て、それを精神的にコードと分けて、数時間後に頭痛を与える傾向があります。 :) – HiredMind

+0

@HiredMind:実際のセットアップとティアダウンが関係しているのであれば、間違いなく便利かもしれません。文字通り「使用している」ステートメントをカプセル化しているのであれば、今後の拡張を計画している場合を除き、1つの繰り返しコードを別のものに置き換える方法はわかりません。つまり、私は間違いなく、中間の操作だけを変更しなければならない複数の操作をグループ化するために、この方法を自分で使用しました。 :) – Joshua

+0

@ジョシュア実際は私の場合はより複雑です。使用時には 'var dbContext = new BodModelContainer()'だけでなく、接続文字列も解決されています。これは別の方法で 'using'ブロックをエクストラクトする最初のポイントです。 2つ目は、1つの作成ポイントdbContextを持つことです。 –

関連する問題