1

共享服務我想知道如何處理的情況時,裏面一個服務可以說ICompanyService我需要從IUserAccountService調用另一個方法。 ?在Repository模式

所以一般可以說,一個公司不應該存在沒有用戶帳戶

IUserAccount實現服務類看起來是這樣的:

public class UserAccountService : CrudService<UserAccount>, IUserAccountService 
{ 
    private readonly IRepository<UserAccount> _userAccountRepository; 
    private readonly IUnitOfWorkFactory _unitOfWorkFactory; 

    public CompanyService(IRepository<UserAccount> userAccountRepository, 
          IUnitOfWorkFactory unitOfWorkFactory) 
     : base(userAccountRepository, unitOfWorkFactory) 
    { 
     _userAccRepository = userAccRepository; 
    } 

    public int RegisterUser(UserAccount user) { 

     using (var uow=_unitOfWorkFactory.Create()) 
     { 
      // Details omitted for brievity 
      var userId = _userAccountRepository.Create(user); 
      uow.Commit(); 
      return userId; 
     } 
    } 

    //Other service methods 

} 

公司ICompanyService實現:

public class CompanyService : CrudService<Company>, ICompanyService 
{ 
    private readonly IRepository<Company> _companyRepository; 
    private readonly IUnitOfWorkFactory _unitOfWorkFactory; 

    public CompanyService(IRepository<Company> companyRepository, 
          IUnitOfWorkFactory unitOfWorkFactory) 
     : base(companyRepository, unitOfWorkFactory) 
    { 
     _companyRepository= companyRepository; 
    } 

    public int CreateCompanyWithUserAccount(Company company) { 

     using (var uow=_unitOfWorkFactory.Create()) 
     { 
      // Some validation with the company.Details omitted for brievity 
      // Here I need an instance of IUserAccountService 
      // Suppose I get it through DI or IoC 
      var userAccountService = IoC.Resolve<IUserAccountService>(); 
    ### // Is such approach good or bad?! ### 
      var userId = userAccountService.RegisterUser(company.UserAccount); 
      // Map the user id to the company 
      company.UserAccount.Id = userId; 
      var companyId = _companyRepository.Create(company); 
      uow.Commit(); 
      return companyId; 
     } 
    } 

    //Other service methods 

} 

ORM庫下:NHibernate的

+1

問題是......? – Sergio

回答

0

你可以只採取依賴IRepository<UserAccount>

public class CompanyService : CrudService<Company>, ICompanyService 
{ 
    private readonly IRepository<Company> _companyRepository; 
    private readonly IRepository<UserAccount> _userAccountRepository; 
    private readonly IUnitOfWorkFactory _unitOfWorkFactory; 

    public CompanyService(IRepository<Company> companyRepository, 
          IUnitOfWorkFactory unitOfWorkFactory 
          IRepository<UserAccount> userAccountRepository) 
     : base(companyRepository, unitOfWorkFactory) 
    { 
     _companyRepository= companyRepository; 
     _userAccountRepository = userAccountRepository; 
    } 

    public int CreateCompanyWithUserAccount(Company company) { 

     using (var uow=_unitOfWorkFactory.Create()) 
     { 
      // Some validation with the company.Details omitted for brievity 
      var userId = _userAccountRepository.Create(company.UserAccount); 
      // Map the user id to the company 
      company.UserAccount.Id = userId; 
      var companyId = _companyRepository.Create(company); 
      uow.Commit(); 
      return companyId; 
     } 
    } 

    //Other service methods 

} 

IMO,最好是對存儲庫進行依賴。畢竟你的公司服務正在創建一個公司,它需要在數據庫中做一些工作,這就是倉庫的用途。從代碼中我可以看到,不需要涉及UserAccountService

+1

然後會是另一個工作單位的實例嗎?我不確定它是好還是壞 –

+0

假設你只是查詢公司服務應該沒有問題。如果你只是查詢,爲什麼不依靠'IRepository '而不是服務?據說,你想實現的邏輯更多的是與UserAccount然後與公司。 – Kenneth

+0

我會更新我的問題的同時,請就行:) –

0
  1. 看來你已經在UserAccountService實現錯構造:public CompanyService

  2. CompanyService實現,你最好解決權在構造IUserAccountService依賴,所以你的,不是你打電話每次都做一次,每次創建對象方法。

  3. 這些依賴關係沒有問題。如果IUnitOfWorkFactory實現的兩個對象出現問題 - >單身生成

+0

我同意你說的注射'IUserAccountService'內'CompanyService'」但是,如果'CreateCompanyWithUserAccount'失敗,那麼在'CreateCompanyWithUserAccount(Company company)'內部調用'RegisterUser(UserAccount user)'可能需要回滾一下。但在這種情況下,沒有回滾的情況。它仍然是'DeleteUser(userId)'還是什麼? –

+0

更確切地說,聽起來會是這樣的:在註冊公司時,我註冊了一個用戶帳戶,所以嵌套事務已經被提交。但是,如果公司註冊在創建用戶帳戶(已經提交)後失敗,會發生什麼情況?我應該刪除它嗎? –

+0

@Christian如果你對SQL有很好的理解,你應該在1次交易中完成。存儲庫方法調用應該看起來像'bool CreateUserAccountWithCompany'。 – Sergio