我有一个WCF服务类PersonService,可以将Person和他/她的地址信息保存到数据库中的Person和Address表中。
以下是实施的两个版本:
版本1(存储库版本)
[ServiceContract]
class PersonService
{
private IPersonRepository _personRepository;
//by referencing other **repository**
private IAddressRepository _addressRepository;
private PersonService(IPersonRepository personRepository, IAddressRepository addressRepository)
{
_personRepository = personRepository;
_addressRepository = addressRepository;
}
public void Add(Person person){
_personRepository.Add(person);
//by calling method from the **repository** layer
if(!_addressRepository.Contains(person.Address))
{
_addressRepository.Add(person.Address);
}
}
}
版本2(服务版)
[ServiceContract]
class PersonService
{
private IPersonRepository _personRepository;
//by referencing other **service**;
private IAddressService _addressService;
private PersonService(IPersonRepository personRepository, IAddressService addressService)
{
_personRepository = personRepository;
_addressService = addressService;
}
public void Add(Person person)
{
_personRepository.Add(person);
//by calling method from the **service** layer
if (!_addressService.Contains(person.Address))
{
_addressService.Add(person.Address);
}
}
}
哪一种更好的做法?像PersonService这样的Service类是否应该更多地与同一层中的接口,或者诸如Repository层之类的较低层?为什么?
答案 0 :(得分:1)
两个版本都是一样的。 接口名称不应建议实现细节。
PersonService类不关心谁实现接口(存储库或服务),只要它获得实现接口的对象。
最后,这就是您使用接口而不是直接使用实现它的类的原因。
如果您正在裁判如何进行依赖注入,我将传递该服务,以防您在AddressService中进行一些缓存或其他处理。