应用服务组合

Application Services Composition

我有一个 Customer 实体,它具有对城市的引用:

public class Customer
{
    public int CustomerId { get; set; }

    public int CityId { get; set;}
}

然后,以下应用服务:

public class CustomerService
{
    private readonly ICustomerRepository customerRepository;

    public CustomerService(ICustomerRepository customerRepository)
    {
        this.customerRepository = customerRepository;
    }

    public void RegisterCustomer(Customer customer)
    {
        //Do another things...

        customerRepository.Save(customer);
    }
}

要注册新客户,服务使用者必须有权访问城市列表以放入 CityId,例如获取城市列表以填充组合框。

因此有必要提供列表城市操作。

我应该将此操作添加到 CustomerService 吗?

喜欢:

public class CustomerService
{
    private readonly ICustomerRepository customerRepository;
    private readonly ICityRepository cityRepository;

    public ServicoCliente(
        ICustomerRepository customerRepository, 
        ICityRepository cityRepository)
    {
        this.customerRepository= customerRepository;
        this.cityRepository= cityRepository;
    }

    public void RegisterCustomer(Customer customer)
    {
        customerRepository.Save(customer);
    }

    public List<City> ListCities()
    {
        return cityRepository.GetAll();
    }
}

或者创建一个新服务:

public class CityService
{
    private readonly ICityRepository cityRepository;

    public CityService(ICityRepository cityRepository)
    {
        this.cityRepository= cityRepository;
    }

    public List<City> ListCities()
    {
        return cityRepository.GetAll();
    }
}

在后一种情况下,消费者应该引用两个服务才能完成一个操作:RegisterCustomer。

遵循哪种方法?这样做的优缺点是什么?

这是代码组织问题,与DDD关系不大

public class CustomerService {

public List ListCities() { return cityRepository.GetAll(); }

}

这里有一个明显的不匹配——您不希望从客户服务 public 接口方法到 return 城市。这打破了最小惊奇原则,将导致未来几代开发人员进行大量搜索和摸不着头脑。

对我来说,专职服务似乎是个更好的主意。