Транзакция базы данных Unity IoC, без выборки обновленных данных, с использованием ContainerControlledLifetimeManager - PullRequest
0 голосов
/ 02 января 2019

Я использую Unity IoC в C # и DbContext с ContainerControlledLifetimeManager для контекста приложения с трехуровневой архитектурой, использующей Entity Framework.Я должен спросить, или этот шаблон лучше в приложении Windows Forms или есть какие-либо предложения лучше.Я также сталкиваюсь с проблемой получения последних данных, когда данные обновляются в базе данных и после обновления формы окна загружаются старые данные.

Поскольку я также использую транзакции с использованием Entity Framework и поэтому не могу использовать TransientLifetimeManager для класса DbContext,Мне нужен один и тот же контекст в разных классах DA для выполнения нескольких операций в одной транзакции.Есть ли лучший подход для решения такой ситуации?

Вот ссылка на проект для демонстрации:

Пример проекта

Универсальный репозиторий

public interface IRepository<ModelClass, EntityClass>
        where ModelClass : class
        where EntityClass : class
    {
            void Add(ModelClass entity);
            void Delete(ModelClass entity);
            void Update(ModelClass entity,int id);
            bool Save();
    }

Реализация универсального репозитория

public class GenericRepository<ModelClass, EntityClass> : IRepository<ModelClass, EntityClass>
        where ModelClass : class
        where EntityClass : class
        {
            private ApplicationContext context = null;
            private DbSet<EntityClass> Entity = null;

        public GenericRepository(ApplicationContext context)
        {
            this.context = context;
            Entity = context.Set<EntityClass>();
        }
        public void Add(ModelClass model)
        {
            EntityClass enityClass = AutoMapper.Mapper.Map<ModelClass, EntityClass>(model);
            this.Entity.Add(enityClass);
        }

        public void Delete(ModelClass model)
        {
            EntityClass enityClass = AutoMapper.Mapper.Map<ModelClass, EntityClass>(model);
            this.Entity.Remove(enityClass);
            context.SaveChanges();
        }

        public void Update(ModelClass model, int id)
        {
            EntityClass dbEntity = Entity.Find(id);
            EntityClass entityClass = AutoMapper.Mapper.Map<ModelClass, EntityClass>(model);
            context.Entry(dbEntity).CurrentValues.SetValues(entityClass);
            context.Entry(dbEntity).State = EntityState.Modified;

        }

        public bool Save()
        {

            bool status = false;
            try
            {
                int result = context.SaveChanges();
                if (result > 0)
                {
                    return status = true;
                }
                else
                    return status;
            }
            catch (DbEntityValidationException dbEx)
            {
              throw;
            }
            return status;
        }

Интерфейс доступа к данным ученика

 public interface IStudent : IRepository<Student, StudentEntity>
    {
        List<Student> GetStudentById(int studentId);
    }

    // Implementation of student access interfaces

     public class StudentAccess : GenericRepository<Student, StudentEntity>, IStudent
    {

        public StudentAccess(ApplicationContext context)
            : base(context)
        {
            this.context = context;
        }

        Public void Add(student std)
        {
            base.Add(std);
            base.save();
        }

         Public void Update(student std,int studentid)
         {
            base.update(std,studentId);
            base.save();
         }


        public List<student>  GetStudentById()
        {
            var data=context.student.ToList();
            return data;
        }
    }

Уровень обслуживания ученика

 public class StudentService
       {
            ApplicationContext Context;
            IStudent student;

        public StudentService(ApplicationContext Context, IStudent student)
        {
            this.Context = Context;
            this.student = student;
        }

        Public void SaveStudent(student std)
        {
            this.student.Add(std);
        }

        Public void UpdateStudent(student std,int studentId)
        {
            this.student.Update(std,studentId);
        }
      }

Реализация контейнера Unity

 public class DependencyOfDependency : UnityContainerExtension
    {
        protected override void Initialize()
        {

            // Register Data access layer

            Container.RegisterType<DbContext, LogisticsERP.DA.Entities.ApplicationContext>(new ContainerControlledLifetimeManager());
            Container.RegisterType< IStudent,StudentAccess>();


            //Register Service Layer Classes
            Container.RegisterType<StudentService>();
         }
    }
...