Единица работы - Все хранилища должны быть свойствами? - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь использовать Repository / UoW Pattern в основном проекте .net.Я посмотрел на многие реализации в Интернете.Во всех реализациях репозитории создаются как свойства в IUnitOfWork.

В будущем, если у нас будет 50 репозиториев, нам нужно иметь 50 свойств в единице работы.Может кто-нибудь предложить лучший подход для реализации Repository / UoW.

Пожалуйста, найдите ниже фрагменты кода подхода, который я реализовал в настоящее время.

IUnitOfWork.cs

 IStudentRepository Student { get; set; }

        IClassRepository Class { get; set; }


        void Complete();

UnitOfWOrk.cs

public class unitofwork {

    private readonly CollegeContext _context;
            IStudentRepository Student { get; set; }

                IClassRepository Class { get; set; }
            public UnitOfWork(CollegeContext CollegeContext)
            {
                this._context = CollegeContext;
    Student =  new StudentRepository(_context);
    Class = new ClassRepository(_context);


            }

            public void Complete()
            {
                return _context.SaveChanges();
            }

}

Репозитории учеников и классов наследуются от универсального класса репозитория и IStudentRepository и IClassRepository соответственно.

StudentRepository.cs

 public  class StudentRepository : Repository<Student>  , IStudentRepository
    {
        private readonly CollegeContext context;
        private DbSet<Student> entities;

        public StudentRepository(CollegeContext context) : base(context)
        {
            this.context = context;
            entities = context.Set<Student>();
        }
    }

1 Ответ

0 голосов
/ 22 октября 2018

Property-per-Repository в некоторых случаях не удобен, как вы сказали.Я обычно использую какой-то фабричный метод в классе UoW, как показано ниже:

public class unitofwork
{

    private readonly CollegeContext _context;
    IStudentRepository Student { get; set; }

    IClassRepository Class { get; set; }
    public UnitOfWork(CollegeContext CollegeContext)
    {
        this._context = CollegeContext;
    }

    public T CreateRepository<T>() where T : IRepository
    {
        IRepository repository = null;
        if(typeof(T) == typeof(IStudentRepository))
            repository = new StudentRepository(_context);
        ......
        ......
        else
            throw new XyzException("Repository type is not handled.");

        return (T)repository;
    }

    public void Complete()
    {
        return _context.SaveChanges();
    }
}

public interface IRepository
{
    Guid RepositoryId { get; }
}

My IRepository просто содержит простое свойство.Вы можете расширить этот интерфейс в соответствии с вашими потребностями.

...