实体VS Id作为参数

时间:2015-02-24 18:59:16

标签: c# performance domain-driven-design

我正在使用DDD。

我有以下界面:

interface ICustomerRepository 
{
    void Disable(int customerId);
}

interface ICustomerService 
{
    void Disable(int customerId);
}

该应用程序将在WebService上运行。

我想知道,我应该使用id作为参数还是整个Customer实体?

每种方法的优点和缺点是什么?

3 个答案:

答案 0 :(得分:5)

嗯,事实是这种行为不应该存在于存储库中。行为应放在实体中。

但是,您的应用程序服务合同应该可以免除域类。

e.g。

//Application service (runs in a transaction)
public void Disable(int customerId) {
    var customer = this.customerRepository.FindById(customerId);
    customer.Disable(); //execute business logic
    this.customerRepository.Save(customer); //persist the state
}

答案 1 :(得分:1)

虽然plalx提供的答案可能是实现这一目标的纯粹方法,但我也发现在某些情况下完全保存可能有点过分。

两者的混合物如何:

interface ICustomerRepository 
{
    void SaveDisable(Customer customer);
}

interface ICustomerService 
{
    void Disable(int customerId);
}

然后代码可能是:

public void Disable(int customerId) {
    var customer = _customerRepository.Get(customerId);
    customer.Disable();
    _customerRepository.SaveDisable(customer);
}

这需要人们非常小心其他功能,因为我们明确说明了什么是持久的。

答案 2 :(得分:0)

使用CudtomerId是一个更好的主意。因为当你传递Customer实体时(通常我们使用pass by value),它会复制它并使用它;默认情况下,这将是一个空实体 所以,我认为你的方式是最好的。