0

Я создал проект, используя MVC3 - Entity Framework. Мне нравится использовать шаблон репозитория вместе с ним. Я новичок в шаблоне репозитория. Нужно ли мне создавать ОДИН КАЖДЫЙ репозиторий для каждого класса модели (классы, которые представляют каждую таблицу в базе данных), и в каждом репозитории мне нужно написать все функции, которые будут вставлять, обновлять, удалять и извлекать запись?Как создать классы репозитория в MVC3 (Entity Framework)?

ответ

0

Нет у вас нет. Вы можете реализовать GenericRepository для всех своих классов, а затем переопределить его, если вам нужно добавить функции. Сначала я покажу вам единицу работы. Через этот класс вы можете получить доступ ко всем репозиториям. Я добавил к этому примеру один общий и один перекрытая:

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); 
    }   
} 
0

Вы можете создать общее хранилище, которое будет иметь общие методы, все остальные хранилища будут это дети:

public class MyModelRepository : GenericRepository<MyModel> 
{ 
    // extend 
} 

var MyModelRepository = new MyModelRepository(); 

См this, или Google для "Generic Repository" :). Если ваш не нужен расширенные функциональные возможности для некоторых моделей хранилища, то вы можете даже не создать класс-хранилище, а не делать что-то вроде этого:

var MyModelRepository = new GenericRepository<MyModel>(); 
+0

У меня есть таблицы, как - Студент, отдел, курс, инструктор и т. Д., А также Модели классов (Student.cs, Department.cs и т. Д.) Для каждого из них в моей модели Folde р. 1. Нужно ли мне создавать классы, как - IStuderntRepositor, StudentRepository, IDepartmentRepository, DepartmentRepository, ICourseRepository, CourseRepository, IInstructorRepository, IInstructorRepository и т.д. 2. Что можно сказать о функциях, вставки, удаления, выберите и обновлять данные из каждой таблицы? Должен ли я записывать эти функции в каждом из этих репозиториев. Например, функция InserStudent, GetStudentAndDepartment()? – user2215116

+0

@ user2215116 no, я сказал, crud операции и основные функции будут в универсальном репозитории, и вам не придется писать их каждый раз – karaxuna

+0

Спасибо большое karaxuna, я посмотрел ссылку на ваш пост. Я думаю, что автор не использует UnitOfWork. Какова роль UnitOfWork? Где я должен его использовать? – user2215116

0

Есть интерфейс, который представляет общие операции между каждым репозиторием. То есть Insert, Update, Удалять и Fetch:

public interface IRepository<T> 
    { 
     void Insert(T entity); 
     void Delete(T entity); 
     void Update(T entity); 
     void Fetch(T entity); 
    } 

public class Repository<T> : IRepository<T> 
    /// your implementation 
} 

Тогда в каждой модели можно определить хранилище в соответствии с контекстом, например:

var repository1 = new Repository<ModelType>(dataContext); 
    repository1.Insert(obj); 

    var repository2 = new Repository<DifferentModelType>(dataContext); 
    repository2.Fetch(objects); 

http://www.remondo.net/repository-pattern-example-csharp/

Смежные вопросы