2

私のリポジトリは次のようになります。

public class SqlRepository<T> : IRepository<T> where T : class
{
    private ExchangeSiteContext _dbContext;
    private DbSet<T> _dbSet;

    #region [Constructor]
    public SqlRepository(ExchangeSiteContext context)
    {
        _dbContext = context;
        _dbSet = context.Set<T>();
    }
    #endregion

    /// <summary>
    /// Gets the DbContext of the repository
    /// </summary>
    public ExchangeSiteContext DbContext
    {
        get
        {
            return this._dbContext;
        }
    }

    /// <summary>
    /// Get a list of entities
    /// </summary>
    /// <returns>List of type T entities</returns>
    public IQueryable<T> GetList()
    {
        return this._dbSet.AsQueryable();
    }

    /// <summary>
    /// Get a list of entities by a predicate
    /// </summary>
    /// <param name="predicate">The predicate</param>
    /// <returns>IQueryable of T</returns>
    public IQueryable<T> GetList(Expression<Func<T, bool>> predicate)
    {
        return this._dbSet.Where(predicate).AsQueryable();
    }

    ...
    ...
}

私の作業単位は次のようになります。

public class SqlUnitOfWork : IUnitOfWork, IDisposable
{
    #region [Private Variables]
    private ExchangeSiteContext _dbContext;
    private BicycleSellerListingRepository _bicycleSellerListingRepository;
    private UserProfileRepository _userProfileRepository;
    #endregion

    #region [Constructor]
    public SqlUnitOfWork()
    {
        this._dbContext = new ExchangeSiteContext();
    }
    #endregion

    #region [Custom Repositories]
    public BicycleSellerListingRepository BicycleSellerListingRepository
    {
        get
        {
            if (this._bicycleSellerListingRepository == null)
                this._bicycleSellerListingRepository = new BicycleSellerListingRepository(this._dbContext);

            return this._bicycleSellerListingRepository;
        }
    }

    public UserProfileRepository UserProfileRepository
    {
        get
        {
            if (this._userProfileRepository == null)
                this._userProfileRepository = new UserProfileRepository(this._dbContext);

            return this._userProfileRepository;
        }
    }
    #endregion

    ///
    /// Generic repository
    ///
    public SqlRepository<T> GenericRepository<T>() where T : class
    {
        return new SqlRepository<T>(this._dbContext);
    }

    public void Commit()
    {
        this._dbContext.SaveChanges();
    }

    public void Dispose()
    {
        this._dbContext.Dispose();
        this._dbContext = null;
    }
}

私のリポジトリはすべて汎用です。私の作業単位には、主に一般的な操作を実行できない場合に備えて、いくつかのカスタム リポジトリがあります。

私の質問は、これは正しく見えますか? 以前にリポジトリや作業単位を作成したことがありません。これはかなりうまくいくようですが、何かを見落としているかどうかはわかりません。

4

2 に答える 2

3

リポジトリと UoW の単一の正しい実装はありません (私としては、リポジトリに渡される DbContext よりも UoW が単純なラッパーである方が好きです)。しかし、ここに私があなたの実装で見たいくつかの問題があります:

  • GetListメソッドが混乱しています。IQueryable彼らはリストの代わりに戻ってきます。GetAllより適切な名前だと思います。
  • を実装している_dbSet.AsQueryable()ため、を呼び出す必要はありません。戻るだけです。DbSet<T>IQueryable<T>_dbSet
  • 通常、熱心な読み込みのために関連するエンティティを含めるための何らかの方法が汎用リポジトリで作成されます。
  • リポジトリが一般的である場合、なぜ特定のコンテキストを使用しているのですか? DbContext代わりに使用してください。
  • なぜDbContextリポジトリから公開するのですか?
  • UoW でコンテキストを作成しています。これにより、依存性注入が不可能になります。
  • _dbContext破棄した後に null に設定する必要はありません。
于 2013-03-15T21:44:58.567 に答える
1

Unit of Work および Repository パターンの実装は、開発者の世界では依然として大きな議論の対象となっていますが、これについて多くのことを読んだ後、私が収集したいくつかのガイドラインを提供できます。

  • ジェネリックを使いすぎないでください。本当にジェネリック リポジトリが必要な場合は、それらすべての間で真に共有されるメソッドのみをそこに配置してください。これをすべて一緒に回避できれば、より良いでしょう。
  • 式ツリーに基づいてフィルタリングするメソッドを配置しないでください。
  • 他の考えをお伝えすることはできますが、これについて私が書いた記事を紹介したいと思います[私のものだからではなく、本当に一生懸命に取り組んだ]
于 2013-03-15T22:17:02.300 に答える