6

EF/Repository/Unit of Work を使用していますが、詳細を理解するのに苦労しています。UnitOfWork 内で、新しい EF DbContext (EmmaContext) を作成しますが、リポジトリ内を見て、間違っているとわかっているものをキャストします。リポジトリ内のコンテキストを正しく取得するにはどうすればよいですか? たぶん私は完全に間違った道を進んでいますか?

ここに私の UnitOfWork があります:

//Interface
public interface IUnitOfWork : IDisposable
{
    void Commit();
}

//Implementation
public class UnitOfWork : IUnitOfWork
{
    #region Fields/Properties
    private bool isDisposed = false;
    public EmmaContext Context { get; set; }
    #endregion

    #region Constructor(s)
    public UnitOfWork()
    {
        this.Context = new EmmaContext();
    }
    #endregion

    #region Methods
    public void Commit()
    {
        this.Context.SaveChanges();
    }

    public void Dispose()
    {
        if (!isDisposed)
            Dispose(true);
        GC.SuppressFinalize(this);
    }

    private void Dispose(bool disposing)
    {
        isDisposed = true;
        if (disposing)
        {
            if (this.Context != null)
                this.Context.Dispose();
        }
    }
    #endregion
}

リポジトリは次のとおりです。

//Interface
public interface IRepository<TEntity> where TEntity : class
{
    IQueryable<TEntity> Query();
    void Add(TEntity entity);
    void Attach(TEntity entity);
    void Delete(TEntity entity);
    void Save(TEntity entity);
}

//Implementation
public abstract class RepositoryBase<TEntity> : IRepository<TEntity> where TEntity : class
{
    #region Fields/Properties
    protected EmmaContext context;
    protected DbSet<TEntity> dbSet;
    #endregion

    #region Constructor(s)
    public RepositoryBase(IUnitOfWork unitOfWork)
    {
        this.context = ((UnitOfWork)unitOfWork).Context;
        this.dbSet = context.Set<TEntity>();
    }
    #endregion

    #region Methods
    public void Add(TEntity entity)
    {
        dbSet.Add(entity);
    }

    public void Attach(TEntity entity)
    {
        dbSet.Attach(entity);
    }

    public void Delete(TEntity entity)
    {
        dbSet.Remove(entity);
    }

    public IQueryable<TEntity> Query()
    {
        return dbSet.AsQueryable();
    }

    public void Save(TEntity entity)
    {
        Attach(entity);
        context.MarkModified(entity);
    }
    #endregion
}
4

4 に答える 4

4

これは 私が読んだ中で最高の記事です。

彼らの例では、彼らは次のようにリポジトリを管理しています。

    private SchoolContext context = new SchoolContext();
    private GenericRepository<Department> departmentRepository;
    private GenericRepository<Course> courseRepository;

    public GenericRepository<Department> DepartmentRepository
    {
        get
        {

            if (this.departmentRepository == null)
            {
                this.departmentRepository = new GenericRepository<Department>(context);
            }
            return departmentRepository;
        }
    }

作業単位はコンテキストを保持し、リポジトリを参照する必要がある場合、リポジトリが作成されていない場合はリポジトリを作成し、保持しているコンテキストを渡します。

この記事では、通常のMVCコントローラーの実装を作業単位パターンの使用に変換する方法についても説明します。

于 2012-08-29T01:00:56.177 に答える
4

Sam: 私は通常、ctor で具体的な UnitOfWork を受け取る具体的なリポジトリに満足しています。

   public RepositoryBase(UnitOfWork unitOfWork)
   {
        this.context = unitOfWork.Context;
        this.dbSet = context.Set<TEntity>();
   }

通常、リポジトリと UoW は連携して動作し、お互いについて少し知る必要があります。

もちろん、これらのクラスを使用するコードは、具体的な型ではなく、インターフェイスの定義についてのみ知っています。

于 2012-08-29T00:50:02.507 に答える
1

この投稿では、リポジトリ ベースに IUnitOfWork インターフェイスを実装する必要があると述べています。

これが役立つことを願っています。よろしく

于 2012-08-28T21:00:55.250 に答える
0

作業単位
リポジトリ

UnitOfWork は、アトミック操作を管理するためのものです。

リポジトリは、データ ストアに永続化された一連のオブジェクトと、それらに対して実行される操作をカプセル化します。

コンテキストまたは UnitOfWork を渡す場合、UnitOfWork+Repository パターンを実装しないよりも、UnitOfWork からその責任を引き出すことになります。別名、必要ありません。

DbSet のみを渡す場合の適切な実装。実際には、それ以上は必要ありません。

于 2014-01-31T16:33:30.123 に答える