簡體   English   中英

ASP.NET MVC工作單元和業務服務/層

[英]ASP.NET MVC UnitOfWork and Business Services / Layer

需要您幫助為我的業務層實施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();

這是有效的方法嗎? 真的需要您的幫助和想法...

謝謝!!!!

您的“ UnitOfWork”應包含反映您的用例的方法。 因此,我將擁有一個類似'CreateContract'的方法,該方法實際上添加了'user'和'contract'並提交了交易,並且僅從控制器調用了該方法。

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

    this.dbContext.SaveChanges();
}

這樣,您可以在此方法中封裝任何事務代碼。 例如-如果添加用戶和合同不僅是EF調用,而且是對其他服務的調用,則可以使用分布式事務或其他代碼來回滾事務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM