MVC3-Entity Frameworkを使用してプロジェクトを作成しました。私はそれと一緒にリポジトリ パターンを使用するのが好きです。私はリポジトリパターンが初めてです。各モデル クラス(データベース内の各テーブルを表すクラス)ごとに 1 つのリポジトリを作成する必要がありますか? また、各リポジトリ内に、レコードを挿入、更新、削除、およびフェッチするすべての関数を記述する必要がありますか?
質問する
1853 次
3 に答える
0
共通のメソッドを持つ共通のリポジトリを作成できます。他のすべてのリポジトリはその子になります。
public class MyModelRepository : GenericRepository<MyModel>
{
// extend
}
var MyModelRepository = new MyModelRepository();
これを参照するか、「汎用リポジトリ」をグーグルで検索してください:)。一部のモデル リポジトリに拡張機能が必要ない場合は、リポジトリ クラスを作成することさえできず、代わりに次のようにします。
var MyModelRepository = new GenericRepository<MyModel>();
于 2013-07-02T09:20:21.137 に答える
0
いいえ、ありません。すべてのクラスに GenericRepository を実装し、関数を追加する必要がある場合はそれをオーバーライドできます。まず、作業単位を示します。このクラスを通じて、すべてのリポジトリにアクセスできます。この例に、1 つのジェネリックと 1 つのオーバーライドを追加しました。
public class UnitOfWork
{
FBDbContext context = new FBDbContext();
public FBDbContext Context { get { return context; } }
private BlockRepository BlockRepository;
private GenericRepository<Category> CategoryRepository;
#region RepositoryClasses
public IBlockRepository blockRepository
{
get
{
if (this.BlockRepository == null)
this.BlockRepository = new BlockRepository(context);
return BlockRepository;
}
}
public IGenericRepository<Category> categoryRepository
{
get
{
if (this.CategoryRepository == null)
this.CategoryRepository = new GenericRepository<Category>(context);
return CategoryRepository;
}
}
#endregion
public void Save()
{
context.SaveChanges();
}
}
次に、汎用リポジトリがあります。
public class GenericRepository<TEntity>
{
internal FBDbContext context;
internal DbSet<TEntity> dbSet;
public GenericRepository(FBDbContext context)
{
this.context = context;
this.dbSet = context.Set<TEntity>();
}
public virtual TEntity Create()
{
return Activator.CreateInstance<TEntity>();
}
public IQueryable<TEntity> GetAll()
{
return dbSet;
}
//And all the functions you want in all your model classes...
}
汎用リポジトリをオーバーライドする場合の例:
public class BlockRepository : GenericRepository<Block>
{
public BlockRepository(FBDbContext context) : base(context) { }
public IEnumerable<Block> GetByCategory(Category category)
{
return context.Blocks.Where(r => r.CategoryId == category.Id);
}
}
于 2013-07-02T09:27:28.677 に答える