using System.Reflection; using MTWorkHR.Core.UnitOfWork; using MTWorkHR.Infrastructure.Data; using MTWorkHR.Core.IRepositories; using MTWorkHR.Core.Global; using MTWorkHR.Infrastructure.Repositories; using MTWorkHR.Core.IRepositories.Base; using MTWorkHR.Infrastructure.Entities; namespace MTWorkHR.Infrastructure.UnitOfWorks { public class UnitOfWork : IUnitOfWork { private readonly HRDataContext context; public IPermissionRepository Permission { get; } public ICompanyRepository Company { get; } public IUserTaskRepository UserTask { get; } public ITaskStatusRepository UserTaskStatus { get; } public IUserTaskHistoryRepository UserTaskHistory { get; } public IUserTaskAttachmentRepository UserTaskAttachment { get; } public IProjectRepository Project { get; } public UnitOfWork(HRDataContext _context , IPermissionRepository permission , ICompanyRepository company , IUserTaskRepository userTask , IProjectRepository project , IUserTaskHistoryRepository projectHistory , ITaskStatusRepository userTaskStatus // ,IUserTaskAttachmentRepository userTaskAttachment ) { context = _context; this.Permission = permission; this.Company = company; this.UserTask = userTask; this.Project = project; this.UserTaskHistory = projectHistory; this.UserTaskStatus = userTaskStatus; // this.UserTaskAttachment = userTaskAttachment; } public async Task CompleteAsync() { try { return await context.SaveChangesAsync(); } catch (Exception ex) { RollbackTran(); throw ex; } } public object GetRepositoryByName(string name) { Type type = this.GetType(); PropertyInfo info = type.GetProperty(name); if (info == null) throw new AppException(ExceptionEnum.PropertyNotAccess, name, type.FullName); //type.FullName, String.Format("A property called {0} can't be accessed for type {1}.", name)); return info.GetValue(this, null); } public void BeginTran() { context.Database.BeginTransaction(); } public void CommitTran() { context.Database.CommitTransaction(); } public void RollbackTran() { var transaction = context.Database.CurrentTransaction; if (transaction != null) context.Database.RollbackTransaction(); } } }