2011-08-05 5 views
5

私はPOCOを使ってプロトタイプのEFアプリケーションを開発しています。主にフレームワークの紹介として、私は素敵な構造でアプリケーションを設定する良い方法について疑問に思っています。その後、WCFを組み込む予定です。私がやった何EFアプリケーションの構造を設定する

は以下の通りです:

1)私はEDMXファイルを作成しますが、コード生成プロパティをNoneに設定し、自分のデータベーススキーマを生成し、

2)私はPOCOSを作成しましたこれはすべて、次のようになります。私は、コンテキストを作成し

public class Person 
{ 
    public Person() 
    { 
    } 

    public Person(string firstName, string lastName) 
    {   

     FirstName = firstName; 
     LastName = lastName; 
    } 

    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

3)

public class PocoContext : ObjectContext, IPocoContext 
{ 
    private IObjectSet<Person> persons; 

    public PocoContext() : base("name=PocoContainer", "PocoContainer") 
    { 
     ContextOptions.LazyLoadingEnabled = true; 
     persons= CreateObjectSet<Person>(); 
    } 

    public IObjectSet<Person> Persons 
    { 
     get 
     { 
      return persons; 
     } 
    } 

    public int Save() 
    { 
     return base.SaveChanges(); 
    } 
} 
public interface IPocoContext 
{ 
    IObjectSet<Person> Persons { get; } 

    int Save(); 
} 

4)最後に、私はインターフェイスを実装し、リポジトリを作成しました:私はこれで遊んで取得するとき

public class PersonRepository : IEntityRepository<Person> 
{ 
    private IPocoContext context; 

    public PersonRepository() 
    { 
     context = new PocoContext(); 
    } 

    public PersonRepository(IPocoContext context) 
    { 
     this.context = context; 
    } 

    // other methods from IEntityRepository<T> 
} 

public interface IEntityRepository<T> 
{ 
    void Add(T entity); 
    List<T> GetAll(); 
    T GetById(int id); 
    void Delete(T entity); 

} 

は今、この設計はインスタンス化するために私に指示インタフェースは次のようになりますリポジトリ私はこのように、いくつかのデータをフェッチまたは変異させたいたび:どういうわけか

using (var context = new PocoContext()) 
{ 
    PersonRepository prep = new PersonRepository(); 

    List<Person> pers = prep.GetAll(); 
} 

これはただ単にド内のすべてのリポジトリをインスタンス化し、一方で、間違っていると感じている欠陥私が必要としない可能性のあるオブジェクトをインスタンス化する可能性があるため、脈絡されたコンテキストはあまりにも良くないと感じません。

どのようにこのデザインのサウンドを作成するためのヒント?私はそれをこのようにしておくべきですか?これを行うときに一般的に追加または拒否すべき事項はありますか?

+0

どのようなアプリケーションですか。 Webサービス、WPF-app、他に何か? – alun

+0

この状態ではコンソールアプリケーションです。最小限のプロトタイプしかないからです。 – duress

+1

私が尋ねる理由は、あなたのコンテキストをどのように扱うかは、アプリケーションの種類によって大きく左右されます。たとえば、wpfアプリケーションではフォームごとに1つのコンテキストを、Webアプリケーションではhttp-requestごとに1つのコンテキストを、Webサービスではメソッド呼び出しごとに1つのコンテキストを持つことが一般的です。 – alun

答えて

2

私はこの部分を理解していない:あなたは、パラメータとしてコンテキストを渡さずに、リポジトリのコンストラクタを呼び出す場合

using (var context = new PocoContext()) 
{ 
    PersonRepository prep = new PersonRepository(); 

    List<Person> pers = prep.GetAll(); 
} 

は、なぜあなたは外側のスコープでコンテキストを作成していますか?複数のコンテキストを使用すると、作業がずっと難しくなります。また、リポジトリのインターフェイスを作って、外側のブロックがクラスのインスタンスを作成するだけの場合、それを隠そうとするのは何ですか?

あなたのアプローチは正しいですか?一般的にはい。 single context for logical operation(作業単位)を使用する必要があります。リポジトリがコンストラクタを介してコンテキストを取得する場合は、各コンテキストに対して新しいリポジトリセットを作成する必要があります。これは、通常、依存性注入によって実現されます。

だけ派生コンテキスト内のすべてのリポジトリをインスタンス化することは があるため、潜在的に、私は 全く必要ないかもしれませんオブジェクトをインスタンス化のため、どちらかあまりにも良い感じがしません。

まあこれは遅延初期化によってかなり簡単に解決することができます。

private SomeRepositoryType _someRepository 
public SomeRepositoryType SomeRepository 
{ 
    get { _someRepository ?? (_someRepository = new SomeRepositoryType(context)) } 
} 

しかし、私は、コンテキスト自体にこれを入れないでしょう。私は多分いくつかのデータアクセスファクトリでこれを使用するでしょう。なぜなら、コンテキスト外で、複数のリポジトリを使用するクラス/メソッドへの注入が単一のファクトリを渡すべきであるからです。

Btw。 what valueリポジトリを使用することはできますか?

+0

私はあなたの記事を読んだ後でそれについて考えて、私が何を言おうとしているのかをコメントすることができればと思います。まず第一に、このプロジェクトは主にチュートリアルからインスピレーションを受けています。今日の午後には、このトピックのスターターがやったのとまったく同じ質問をしていました。リポジトリは、私がAddObject(または何でも)を呼び出す余分なレイヤーを追加するだけです。 – duress

1

POCOを使用してデータベースのモデルを作成する場合は、まずEFコードを試しますか?コードファーストを使用するIMHOは、デザイナでEDMXモデルを作成するよりもはっきりとしています。

+0

そうですが、この場合、edmxがどのように設定されているかについていくつか選択することができます。 – duress

+0

本当にこのアドバイスに従い、コードファーストを使用してください。最初にEDMXを混乱させる理由はありません。 edmxがどのように見えるかを実際に見たい場合は、コードのファーストクラスから生成するオプションがあります。 –

0

Castle Windsor、AutoFacなどの任意のコンテナを使用して、リクエストごとのオブジェクトコンテキストを提供することにより、依存性注入を使用します。