我的.NET Web服务中有一个命令需要在几个不同的地方保存信息:
我想使用工作单元模式。只有数据库并使用数据上下文时,这很容易。
但是你知道如何用混合目标实现工作单元吗?我知道我不能依赖分布式交易,我可以不用。但是工作单位的原则是我想保留的。
我可以使用任何想法,建议或模式吗?
答案 0 :(得分:1)
您不需要将数据库保存逻辑与REST保存逻辑混合使用。您可以让UoW模块专门用于数据库,并在顶部添加一个额外的服务层,利用UoW保存在数据库中,之后调用REST端点也可以保存在那里。服务层将在常用方法下协调不同的操作。
您能否提供一些示例代码,以便为您提供更合适的建议?
修改强>:
好的,这是一些通用的例子:
这是你的UnitOfWork类:
public class UnitOfWork : IUnitOfWork, IDisposable
{
private DatabaseContext context = new DatabaseContext();
private IDepartmentRepository departmentRepository;
private ICustomerRepository customerRepository;
public IDepartmentRepository DepartmentRepository
{
get
{
if (this.departmentRepository == null)
{
this.departmentRepository = new DepartmentRepository(context);
}
return departmentRepository;
}
}
public ICustomerRepository CustomerRepository
{
get
{
if (this.customerRepository == null)
{
this.customerRepository = new CustomerRepository(context);
}
return customerRepository;
}
}
public void Save()
{
context.SaveChanges();
}
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
context.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
您服务层的一部分可能如下所示:
class CustomerService : ICustomerService
{
private IUnitOfWork unitOfWork;
public CustomerService(IUnitOfWork unitOfWork)
{
this.unitOfWork = unitOfWork;
}
public void AddCustomer(Customer customer)
{
this.unitOfWork.CustomerRepository.Add(customer);
this.unitOfWork.Save();
// Call REST here
}
public void DeleteCustomer(int customerId)
{
this.unitOfWork.CustomerRepository.DeleteById(customerId);
this.unitOfWork.Save();
// Call REST here
}
}
在您的控制器中,您只能通过服务层进行操作。在当前示例中,如果要添加/删除客户等,您将实例化新的CustomerService ...
请记住,这几乎是一个伪代码,可能无法准确地满足您的需求,但如果没有任何有关您的上下文的信息,则无法做更多的事情。