Я использую 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>();
}
}