[英]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
。
Seems you have wrong constructor in UserAccountService
implementations: public CompanyService
似乎您在UserAccountService
实现中使用了错误的构造函数: public CompanyService
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
依赖关系,因此您对每个对象创建一次,而不是每次调用方法一次。
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.