实体 VS Id 作为参数
Entity VS Id as Parameter
我正在使用 DDD。
我有以下接口:
interface ICustomerRepository
{
void Disable(int customerId);
}
interface ICustomerService
{
void Disable(int customerId);
}
该应用程序将在 WebService 上运行。
我想知道,我应该使用 id 作为参数还是整个 Customer 实体?
每种方法的优缺点是什么?
使用 CudtomerId 是一个更好的主意。因为当您传递 Customer 实体时(通常我们使用按值传递),它会复制它并使用它;默认情况下将是一个空实体。
所以,我觉得你的方法最好。
好吧,事实是这种行为不应该出现在存储库中。行为应该放在实体中。
但是,您的应用程序服务合同可能应该免除域名 类。
例如
//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
}
尽管 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);
}
这将要求您对附加功能非常小心,因为我们明确说明了持久化的内容。
我正在使用 DDD。
我有以下接口:
interface ICustomerRepository
{
void Disable(int customerId);
}
interface ICustomerService
{
void Disable(int customerId);
}
该应用程序将在 WebService 上运行。
我想知道,我应该使用 id 作为参数还是整个 Customer 实体?
每种方法的优缺点是什么?
使用 CudtomerId 是一个更好的主意。因为当您传递 Customer 实体时(通常我们使用按值传递),它会复制它并使用它;默认情况下将是一个空实体。
所以,我觉得你的方法最好。
好吧,事实是这种行为不应该出现在存储库中。行为应该放在实体中。
但是,您的应用程序服务合同可能应该免除域名 类。
例如
//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
}
尽管 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);
}
这将要求您对附加功能非常小心,因为我们明确说明了持久化的内容。