パターンEntity Frameworkの4「作業ユニットは、」一般的なリポジトリのために行くための方法ですか?

StackOverflow https://stackoverflow.com/questions/2818029

質問

私は私が働いている新しいASP.NET MVCプロジェクトのためのEntity Frameworkの4ジェネリックリポジトリを作成するに探しています。私は、さまざまなチュートリアルを見てきた、彼らはすべての作業パターンの単位を使用するように見える...

は、私が読んでいたものから、EFはObjectContextは内、すでにこれを使用している、あなたは、単に仕事の独自の単位を作るために、これを拡張しています。

ソース:<のhref = "http://dotnet.dzone.com/news/using-unit-work-pattern-entity?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+zones%2Fdotnet+(.NET+Zone )」のrel = "nofollowをnoreferrer"> http://dotnet.dzone.com/news/using-unit-work-pattern-entity?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+zones%2Fdotnet+(.NET +ゾーン) の

なぜ1は、これを行うの努力に行くのでしょうか? これは、一般的なリポジトリでの作業の好ましい方法ですか?

多くのおかげで、 湖畔ます。

役に立ちましたか?

解決

これは、私は、一般的なリポジトリとうまくいく方法ではありません。まず第一に、私は現在のリクエストにClassARepository、CalssBRepositoryと他のリポジトリ間のObjectContextを共有することになります。 、IOCのコンテナを使用して注入し、要求行動ごとに使用することが推奨されます:

これは私の一般的なリポジトリがどのように見えるかです

public interface IRepository<T>
{
    //Retrieves list of items in table
    IQueryable<T> List();
    IQueryable<T> List(params string[] includes);
    //Creates from detached item
    void Create(T item);
    void Delete(int id);
    T Get(int id);
    T Get(int id, params string[] includes);
    void SaveChanges();
}

public class Repository<T> : IRepository<T> where T : EntityObject
{
    private ObjectContext _ctx;

    public Repository(ObjectContext ctx)
    {
        _ctx = ctx;
    }


    private static string EntitySetName
    {
        get
        {
            return String.Format(@"{0}Set", typeof(T).Name);
        }
    }

    private ObjectQuery<T> ObjectQueryList()
    {
        var list = _ctx.CreateQuery<T>(EntitySetName);
        return list;
    }

    #region IRepository<T> Members

    public IQueryable<T> List()
    {
        return ObjectQueryList().OrderBy(@"it.ID").AsQueryable();
    }

    public IQueryable<T> List(params string[] includes)
    {
        var list = ObjectQueryList();

        foreach(string include in includes)
        {
            list = list.Include(include);
        }

        return list;
    }

    public void Create(T item)
    {
        _ctx.AddObject(EntitySetName, item);
    }

    public void Delete(int id)
    {
        var item = Get(id);
        _ctx.DeleteObject(item);
    }

    public T Get(int id)
    {
        var list = ObjectQueryList();
        return list.Where("ID = @0", id).First();
    }

    public T Get(int id, params string[] includes)
    {
        var list = List(includes);
        return list.Where("ID = @0", id).First();
    }

    public void SaveChanges()
    {
        _ctx.SaveChanges();
    }

    #endregion

}

のObjectContextは、コンストラクタを介して注入されます。リスト()メソッドは、ビジネス層(サービス)オブジェクトにさらなる処理のためのIQueryableを返します。サービス層は、リストまたはIEnumerableをを返すので、ビューには繰延実行はありません。

このコードは、EF1を使用して作成されました。 EF4のバージョンが少し違うとシンプルにすることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top