简体   繁体   English

存储库模式中的共享服务

[英]Shared services in Repository Pattern

I am wondering how to deal with a situation when inside one service lets say ICompanyService I need to call another method from IUserAccountService . 我想知道如何处理一个服务内部的情况,比如说ICompanyService我需要从IUserAccountService调用另一个方法。 ?

So generally lets say that a Company shouldn't exist without an UserAccount . 因此,一般来说,如果没有UserAccount ,则公司不应该存在。

The IUserAccount implementation service class looks like this: 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

}

The company ICompanyService implementation: 公司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 under the repository is: NHibernate 存储库下的ORM是: NHibernate

You could just take a dependency on the IRepository<UserAccount> : 您可以仅依赖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, it's better to take a dependency on the repository. IMO,最好依赖存储库。 After all your company service is creating a company and it needs to do some work in the database, which is what the repositories are for. 贵公司的所有服务创建完公司之后,它需要在数据库中做一些工作,这就是存储库的作用。 From what I can see in the code, there's no need to involve the UserAccountService . 从代码中可以看到,不需要涉及UserAccountService

  1. Seems you have wrong constructor in UserAccountService implementations: public CompanyService 似乎您在UserAccountService实现中使用了错误的构造函数: public CompanyService

  2. In CompanyService implementation, you better resolve IUserAccountService dependency right in a constructor, so you do it once per object creation, not each time you call method. CompanyService实现中,最好在构造函数中正确解析IUserAccountService依赖关系,因此您对每个对象创建一次,而不是每次调用方法一次。

  3. There's no problems with those dependencies. 这些依赖关系没有问题。 If two objects of IUnitOfWorkFactory implementations are problem -> make a singleton 如果IUnitOfWorkFactory实现的两个对象有问题->使一个单例

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM