【问题标题】:ASP.NET MVC UnitOfWork and Business Services / LayerASP.NET MVC UnitOfWork 和业务服务/层
【发布时间】:2017-01-07 19:18:38
【问题描述】:

需要您帮助为我的业务层实施 UnitOfWork。 想要将多个不同的业务服务调用包装到一个事务中。 假设我使用实体框架作为我的存储库层,并且我有一个额外的业务层用于验证和其他业务规则。在这个例子中非常非常简单。

public class MyDbContext
{
    public DbSet<User> Users;
    public DbSet<Contract> Contracts;
}

public class UserService
{
    public UserService(MyDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public void AddUser(User user)
    {
        _dbContext.Users.Add(user);
        _dbContext.SaveChanges();
    }
}

public class ContractService
{
    public ContractService(MyDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public void AddContract(Contract contract)
    {
        _dbContext.Contracts.Add(contract);
        _dbContext.SaveChanges();
    }
}

在我的控制器中:

userService.AddUser(user);
contractService.AddContract(contract);

... 添加用户调用已保存更改,但我想在添加合同后保存更改。 那么我可以执行以下操作吗?或者这是某种糟糕的设计?!

创建 UnitOfWork 类:

public class UnitOfWork
{
    public UnitOfWork(MyDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public MyDbContext DbContext => _dbContext;

    public void SaveChanges()
    {
        _dbContext.SaveChanges();
    }
}

将我的服务更改为:

public class UserService
{
    public UserService(UnitOfWork unitOfWork)
    {
        _unitOfWork = unitOfWork;
    }

    public void AddUser(User user)
    {
        _unitOfWork.DbContext.Users.Add(user);
    }
}

public class ContractService
{
    public ContractService(UnitOfWork unitOfWork)
    {
        _unitOfWork = unitOfWork;
    }

    public void AddContract(Contract contract)
    {
        _unitOfWork.DbContext.Contracts.Add(contract);
    }
}

然后在我的控制器中我这样做:

userService.AddUser(user);
contractService.AddContract(contract);
unitOfWork.SaveChanges();

这是一种有效的方法吗?!真的需要你的帮助和想法......

谢谢!!!!

【问题讨论】:

    标签: c# asp.net asp.net-mvc unit-of-work business-layer


    【解决方案1】:

    您的“UnitOfWork”应包含反映您的用例的方法。所以我会有一个像“CreateContract”这样的方法,它实际上添加了“用户”和“合同”并提交交易,然后从控制器调用这个方法。

    public void CreateContract(User user,Contract contract)
    {
        this.dbContext.Users.Add(user);
        this.dbContext.Contracts.Add(contract);  
    
        this.dbContext.SaveChanges();
    }
    

    通过这种方式,您可以在此方法中封装任何事务代码。 Ex - 如果添加用户和合约不仅仅是 EF 调用,而是对不同服务的调用,您可以使用分布式事务或其他代码来回滚事务。

    【讨论】:

    • 嗯,但我有数百个这样的服务调用链应该作为单个事务执行。我不能在单个 UnitOfWork 类中添加所有这些方法......好吧,我可以为不同的区域创建一个 UnitOfWork 类,但最后在我的 Web 应用程序中,几乎每个事务都代表一个 Web 请求 / 控制器操作......这就是我想要的原因当所有服务调用都成功时,在控制器操作结束时调用 Commit...
    猜你喜欢
    • 2013-11-10
    • 2011-02-06
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 2011-04-03
    • 1970-01-01
    相关资源
    最近更新 更多