1

私はエンティティフレームワークで汎用リポジトリを操作しようとしていますが、以下のコードに出くわしました。

public class GenericRepository<TContext, TEntity> : IGenericRepository<TEntity>
where TContext : IUnitOfWork
where TEntity : class
{
protected TContext _context;
/// <summary>
/// Constructor that takes a context
/// </summary>
/// <param name="context">An established data context</param>
public GenericRepository(TContext context)
{
    _context = context;
}

public IQueryable<TEntity> Select()
{
    return _context.Set<TEntity>().AsQueryable();
}

public IEnumerable<TEntity> GetAll()
{
    return _context.Set<TEntity>().AsEnumerable();
}

public IEnumerable<TEntity> Where(Func<TEntity, bool> predicate)
{
    return _context.Set<TEntity>().Where(predicate);
}

public TEntity GetSingle(Func<TEntity, bool> predicate)
{
    return _context.Set<TEntity>().Single(predicate);
}

public TEntity GetFirst(Func<TEntity, bool> predicate)
{
    return _context.Set<TEntity>().First(predicate);
}

public void Add(TEntity entity)
{
    if (entity == null)
        throw new ArgumentException("Cannot add a null entity");

    _context.Set<TEntity>().Add(entity);
}

public void Delete(TEntity entity)
{
    if (entity == null)
        throw new ArgumentException("Cannot delete a null entity");

    _context.Set<TEntity>().Remove(entity);
}

public void Attach(TEntity entity)
{
    if (entity == null)
        throw new ArgumentException("Cannot attach a null entity");

    _context.Set<TEntity>().Attach(entity);
}

#region IDisposable implementation
private bool disposedValue;

public void Dispose(bool disposing)
{
    if (!this.disposedValue)
    {
        if (disposing)
        {
            // dispose managed state here if required
        }
        // dispose unmanaged objects and set large fields to null
    }
    this.disposedValue = true;
}

public void Dispose()
{
    Dispose(true);
    GC.SuppressFinalize(this);
}
#endregion
 }

ただし、作成されたコンストラクターの必要性を理解するのは少し難しいと思います

/// <summary>
/// Constructor that takes a context
/// </summary>
/// <param name="context">An established data context</param>
public GenericRepository(TContext context)
{
    _context = context;
}

誰かがこれの使用法を説明できますか?

ありがとう

4

1 に答える 1

2

これは、プロジェクトに複数の DbContext クラスが存在する可能性があるためです。そのため、特定の DbContext インスタンスを挿入して、使用している DbContext を GenericRepository クラスに伝える必要があります。

複数の DbContext クラスが必要な理由は次のとおりです。

  1. プロジェクトのターゲットは複数のデータベースです。

  2. あなたのプロジェクトは大規模で、パフォーマンスと保守性を考慮して、いくつかのモジュールに分割したいと考えています。例えば:

    public class BaseContext<TContext> : DbContext
      where TContext : DbContext, new()        
    {        
        protected BaseContext()
        : base("name=ConnectionString")
        {            
        }
    }
    
    public class ShopDbContext :BaseContext<ShopDbContext>
    {
        public DbSet<Product> Products{ get; set; }
    }
    
    public class BlogDbContext :BaseContext<BlogDbContext>
    {
        public DbSet<Blog> Blogs{ get; set; }
    }
    

ここで、製品を照会する場合は、ShopDbContext をインスタンス化し、それを GenericRepository コンストラクターに渡す必要があります (IoC が適切な選択です)。

于 2012-10-31T06:32:44.827 に答える