使用工作单元和不同目标保存信息

时间:2017-08-09 11:36:04

标签: c# entity-framework web-services design-patterns unit-of-work

我的.NET Web服务中有一个命令需要在几个不同的地方保存信息:

  • 使用实体框架的1个本地数据库SQL Server
  • 使用REST的2个不同的Web服务

我想使用工作单元模式。只有数据库并使用数据上下文时,这很容易。

但是你知道如何用混合目标实现工作单元吗?我知道我不能依赖分布式交易,我可以不用。但是工作单位的原则是我想保留的。

我可以使用任何想法,建议或模式吗?

1 个答案:

答案 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 ...

请记住,这几乎是一个伪代码,可能无法准确地满足您的需求,但如果没有任何有关您的上下文的信息,则无法做更多的事情。