0

MVC3-Entity Frameworkを使用してプロジェクトを作成しました。私はそれと一緒にリポジトリ パターンを使用するのが好きです。私はリポジトリパターンが初めてです。各モデル クラス(データベース内の各テーブルを表すクラス)ごとに 1 つのリポジトリを作成する必要がありますか? また、各リポジトリ内に、レコードを挿入、更新、削除、およびフェッチするすべての関数を記述する必要がありますか?

4

3 に答える 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 に答える