在 Onion Structure 中,一个基础设施服务可以调用另一个基础设施服务吗?

In Onion Structure, can an infrastructure service call another infrastructure service?

例如基础设施层有两个服务:

  1. Contact,这是一个 Elasticesearch 服务。
  2. PhoneNumber 这是一项 SQL 服务。

Contact 服务需要获取每个联系人的 phone 号码和 return 给它的调用者,所以它需要调用 PhoneNumber 服务。

请问Contact是否可以直接调用PhoneNumber?他们都在基础设施层。

或者,我是不是应该先让Contactreturn到domain层的服务,再让domain层服务调用PhoneNumber?

谢谢!

简短的回答是,在基础架构中,在另一个服务中使用一个服务不是正确的模式,因为这一层中的所有服务都应该是第三方服务,并且在我们的基础架构层中它们之间应该没有关系。

应用层负责从基础设施服务中获取数据。 例如,在这一层中,可以实现以下方法

List<string> GetPhoneNumbers(string contactName)
{
  var phoneNumbers = new List<string>();

  var contacts = _contactService.GetContacts(contactName);
  foreach(var contact in contacts)
  {
    var phoneNumber = _phoneService.GetPhoneNumber(contact)
    phoneNumbers.Add(phoneNumber);
  }    
  return phoneNumbers;
}

_contactService_phoneService 是基础设施层中的两个服务。如果您使用 Repository 模式,更好的名称是 _contactRepository_phoneRepository