我经常在业务对象上看到这样的例子:
public void Save()
{
if(this.id > 0)
{
ThingyRepository.UpdateThingy(this);
}
else
{
int id = 0;
ThingyRepository.AddThingy(this, out id);
this.id = id;
}
}
那么为什么在这里,在业务对象上呢?这似乎与上下文或数据相关,而不是业务逻辑。
例如,这个对象的消费者可能会经历这样的事情......
...Get form values from a web app...
Thingy thingy = Thingy.CreateNew(Form["name"].Value, Form["gadget"].Value, Form["process"].Value);
thingy.Save();
或者,类似这样的更新...
... Get form values from a web app...
Thingy thingy = Thingy.GetThingyByID(Int32.Parse(Form["id"].Value));
Thingy.Name = Form["name"].Value;
Thingy.Save();
那么这是为什么呢?为什么不包含实际的业务逻辑,例如计算、业务特定规则等,并避免检索/持久化?
使用这种方法,代码可能如下所示:
... Get form values from a web app...
Thingy thingy = Thingy.CreateNew(Form["name"].Value, Form["gadget"].Value, Form["process"].Value);
ThingyRepository.AddThingy(ref thingy, out id);
或者,类似这样的更新...
... get form values from a web app ...
Thingy thingy = ThingyRepository.GetThingyByID(Int32.Parse(Form["id"].Value));
thingy.Name = Form["Name"].Value;
ThingyRepository.UpdateThingy(ref thingy);
在这两个示例中,最了解对象正在做什么的消费者调用存储库并请求添加或更新。该对象在该上下文中仍然是 DUMB,但仍提供与其自身相关的核心业务逻辑,而不是如何检索或保留它。
简而言之,我没有看到在业务对象本身中整合 GET 和 SAVE 方法的好处。
我应该停止抱怨和顺从,还是我错过了什么?