Шаблон репозитория наряду с ФВ и единицы работы


Я новичок в этом шаблон репозитория и видел много репозитория шаблон реализаций + ВУ по всему интернету, и я не смог прийти к выводу, какой из них является правильным . Пройдя через множество связей, я сумел реализовать один .

Учитывая следующие моменты в виду

  • Она должна удовлетворять твердые принципы
  • Быть проверяемой
  • Быть независимым в рамках
  • Быть независимым от БД

Вот код реализации

Универсальный IRepository

 public interface IRepository<T> where T : class
    {

        void Add(T entity);

        void Update(T entity);

        void Delete(T entity);

        T GetByKey(object id);

    }

RepositoryBase

public abstract class RepositoryBase<D, T> : IRepository<T> where T : class where D : BaseDbContext
{


    private D dataContext;
    private readonly IDbSet<T> dbSet;

    protected IDbFactory<D> DbFactory
    {
        get;
        private set;
    }

    protected D DbContext
    {
        get { return dataContext ?? (dataContext = DbFactory.Init()); }
    }


    protected RepositoryBase(IDbFactory<D> dbFactory)
    {

        DbFactory = dbFactory;
        dbSet = DbContext.Set<T>();

    }


    #region Implementation
    public virtual void Add(T entity)
    {
        dbSet.Add(entity);
    }

    public virtual void Update(T entity)
    {
        dbSet.Attach(entity);
        DbContext.Entry(entity).State = EntityState.Modified;
    }

    public virtual void Delete(T entity)
    {
        dbSet.Remove(entity);
    }


    public T GetByKey(object id)
    {
        return dbSet.Find(id);
    }


    #endregion

}

IUnitofWork , UnitOfWork

public interface IUnitOfWork<D> where D : BaseDbContext
    {
        void Commit();
    }



public class UnitOfWork<D> : IUnitOfWork<D> where D : BaseDbContext, new()
{
    private readonly IDbFactory<D> dbFactory;
    private D dbContext;

    public UnitOfWork(IDbFactory<D> dbFactory)
    {
        this.dbFactory = dbFactory;
    }

    public D DbContext
    {
        get { return dbContext ?? (dbContext = dbFactory.Init()); }
    }

    public void Commit()
    {
        DbContext.SaveChanges();
    }
}

IDBFactory ,DBFactory

public interface IDbFactory<D> where D : BaseDbContext
{
    D Init();
}




public class DbFactory<D> : Disposable, IDbFactory<D> where D : BaseDbContext, new()
        {
            D dbContext;
            public D Init()
            {
                return dbContext ?? (dbContext = new D());
            }
            protected override void DisposeCore()
            {
                if (dbContext != null)
                    dbContext.Dispose();
            }
        }

BaseDbContext

public abstract class BaseDbContext : DbContext
{
public BaseDbContext(string nameOrConnectionString) : base(nameOrConnectionString)
        {

        }

}

ProjectDbContext

 public partial class ProjectDbContext : BaseDbContext
    {
        public ProjectDbContext()
            : base("name=ProjectDbContext")
        {
            Database.SetInitializer<ProjectDbContext>(null);
        }


    }

ПРИМЕР ИСПОЛЬЗОВАНИЯ

Контроллер

 public class StudentsController : BaseController
    {

        private IStudentBusiness objstudentbusiness;
        public StudentsController(IStudentBusiness rstudentbusiness)
        {
            objstudentbusiness = rstudentbusiness;
        }


        public JsonResult LoadStudents()
        {

                var data = objstudentbusiness.ListStudents();
                var jsonResult = Json(data, JsonRequestBehavior.AllowGet);
                return jsonResult;

        }

    }

IStudentBAL,StudentBAL

 public interface IStudentBAL
    {
        void SaveStudent(StudentDto student);
        List<StudentDto> ListStudents();
    }


public class StudentBAL : BusinessBase, IStudentBAL
{

    private readonly IStudentRepository objStudentRepository;
    private readonly IUnitOfWork<ProjectDbContext> objIUnitOfWork;

    public StudentBAL(IStudentRepository rIStudentRepository, IUnitOfWork<ProjectDbContext> rIUnitOfWork)
    {
        try
        {
            objStudentRepository = rIStudentRepository;
            objIUnitOfWork = rIUnitOfWork;
        }
        catch (Exception ex)
        {

            Log.Error(ex);
        }

    }

    public List<StudentDto> ListStudents()
    {
        try
        {
            var tusrs = objStudentRepository.ListStudents() ?? new List<StudentDto>();
            return tusrs;
        }
        catch (Exception ex)
        {
            Log.Error(ex);

        }
        return new List<StudentDto>();
    }
}

IStudentRepository,StudentRepository

 public interface IStudentRepository
    {
        void SaveStudent(Student Student);
        StudentDto GetStudentByName(StudentDto Studentname);
        Student GetStudentByID(int Studentid);
        List<StudentDto> ListStudents();
    }

public class StudentRepository : RepositoryBase<ProjectDbContext, Student>, IStudentRepository
{
    public StudentRepository(IDbFactory<ProjectDbContext> dbFactory) : base(dbFactory)
    {
    }
    public List<StudentDto> ListStudents()
    {

            var students = (from t in DbContext.Students

                        select new StudentDto
                        {
                           // all the required properties
                        }).ToList();


            return students;

    }
}
  • Инъекции зависимостей осуществляется с помощью AutoFac
  • Код для входа опущен

Я прошу, если это кажется хорошей реализации или я что-то упускаю?

Я бы признательны за любые отзывы о моей реализации вы можете предложить по поводу правильности, эффективности и предложения. Так вот мои вопросы

  • Это слабосвязанной ?
  • Это имея дырявые абстракции и почему ?
    • Что нужно сделать, чтобы перейти от эф на другой ORM, например Dapper или простой ADO.net и сколько усилий потребуется для реализации изменений?
  • Этот шаблон разорвать любого твердого princples ,законом или Деметры или любом объектно-ориентированном законы?
  • Это картина у любого дублирования кода не требуется ?
  • Как эта архитектура с использованием эф бы данные с проекта, содержащего более 100 сущностей предметной области и с каждым лицо, имеющее по меньшей мере более чем 10 полей . Это будет кошмар техническое обслуживание в дальнейшем?

-Все критические замечания с благодарностью !!

Редактировать : что нужно сделать, чтобы перейти от эф на другой ORM, например Dapper или простой ADO.net и сколько усилий потребуется для реализации изменений?



Комментарии
1 ответ

Не можете решить все ваши очки, но могу высказать свое мнение на несколько.


Что нужно сделать, чтобы перейти от эф к MySQL?

Вам не нужно переключаться с эф к MySQL, фреймворк лицо может быть использован, чтобы пойти против практически любого источника данных. Просто (ок, не всегда просто) укажите ваш EF в ваш источник данных MySQL, используя MySQL и поставщиков. С любой удачей это будет так же просто, как изменение строки подключения.


Это картина у любого дублирования кода не требуется ?

Некоторые утверждают, что шаблон репозитория является избыточной при использовании Рамочной лица с эф уже делать то, что шаблон репозитория и единицы работы парадигм призыв. Издевается и тестирование могут быть единственным случаем, но даже это может быть сделано с разработки исходных данных и фиктивные данные.

0
ответ дан 22 февраля 2018 в 05:02 Источник Поделиться