我的项目有三层
在
ApplicationCore
我有一个存储库界面:
public interface IRepository<TEntity> where TEntity : class
{
List<TEntity> GetAll(ISpecification<TEntity> specification = null);
TEntity GetById(int id);
void Add(TEntity entity);
void AddRange(IEnumerable<TEntity> entities);
void Update(TEntity entity);
void Delete(TEntity entity);
}
和一个
IUnitOfWork
界面:
public interface IUnitOfWork
{
void BeginTransaction();
IRepository<TEntity> GetRepository<TEntity>() where TEntity : class;
void Commit();
void TransactionCommit();
void Rollback();
}
在
Infrastructure
层,我实现了这些接口:
public class EfRepository<TEntity> : IRepository<TEntity> where TEntity : class
{
private readonly OrderExchangeEntities _context;
private readonly DbSet<TEntity> _entities;
public EfRepository(OrderExchangeEntities context)
{
_context = context;
_entities = _context.Set<TEntity>();
}
public List<TEntity> GetAll(ISpecification<TEntity> specification = null)
{
if (specification != null)
{
return _entities.Where(specification.Criteria).ToList();
}
return _entities.ToList();
}
public TEntity GetById(int id)
{
return _entities.Find(id);
}
public void Add(TEntity entity)
{
_entities.Add(entity);
}
public void Update(TEntity entity)
{
_entities.Attach(entity);
_context.Entry(entity).State = EntityState.Modified;
}
public void Delete(TEntity entity)
{
_entities.Remove(entity);
}
public void AddRange(IEnumerable<TEntity> entities)
{
_context.Set<TEntity>().AddRange(entities);
}
}
实施
IUnitOfWork
:
public class EFUnitOfWork : IUnitOfWork
{
private readonly OrderExchangeEntities _dbContext;
private IDbTransaction _transaction;
public EFUnitOfWork(OrderExchangeEntities dbContext)
{
_dbContext = dbContext;
}
public void BeginTransaction()
{
_transaction = _dbContext.Database.Connection.BeginTransaction();
}
public void Commit()
{
_dbContext.SaveChanges();
}
public IRepository<TEntity> GetRepository<TEntity>() where TEntity : class
{
return new EfRepository<TEntity>(_dbContext);
}
public void Rollback()
{
_transaction?.Rollback();
}
public void TransactionCommit()
{
try
{
_transaction?.Commit();
}
catch
{
_transaction?.Rollback();
}
}
}
如何在
OrderPaymentService
中使用此开始交易?
public class OrderPaymentMessageService : IOrderPaymentMessageService
{
private readonly IRepository<OrderPaymentMessage> _orderPaymentMessageRepository;
private readonly IUnitOfWork _unitOfWork;
private readonly IAppLogger _applogger;
private readonly IOrderService _orderServices;
public OrderPaymentMessageService(IRepository<OrderPaymentMessage> orderPaymentMessageRepository, IUnitOfWork unitOfWork, IAppLogger applogger, IOrderService orderServices)
{
_unitOfWork = unitOfWork;
_orderPaymentMessageRepository = _unitOfWork.GetRepository<OrderPaymentMessage>();
_applogger = applogger;
_orderServices = orderServices;
}
public bool Create(OrderPaymentMessage orderPaymentMessage)
{
try
{
Guard.Against.Null(orderPaymentMessage, nameof(orderPaymentMessage));
_orderPaymentMessageRepository.Add(orderPaymentMessage);
_unitOfWork.Commit();
return true;
}
catch (Exception ex)
{
_applogger.LogError(ex);
return false;
}
}
public List<OrderPaymentMessageModel> GetMessageByOrderID(int orderID)
{
try
{
Guard.Against.Zero(orderID, nameof(orderID));
var query =new GetOrderPaymentMessageByOrderID(orderID);
return _orderPaymentMessageRepository.GetAll(query).Select(x => new
OrderPaymentMessageModel
{
OrderID = x.OrderID,
ID = x.ID,
Message = x.Message,
CreatedDate = x.CreatedDate
}
).ToList();
}
catch (Exception ex)
{
_applogger.LogError(ex);
return null;
}
}
}
我想在
OrderPaymentMessageService
创建方法中使用Begin transaction并使用transaction更新Order Record