在webapi中公开域逻辑
本文关键字:webapi | 更新日期: 2023-09-27 18:13:06
所以在REST中我有一个产品资源…
http://api/product
问题是如果我有一些领域逻辑呢?在面向对象的世界中,我可能有
public class product
{
int id;
public product(){}
public int Calc(int first, int second)
{
return first + second;
}
}
我如何表示这个业务逻辑?我想我可以……
public int GetCalc(int id, int first, int second)
{
localProduct = products[id];
return localProduct(first + second);
}
因此服务的URL将变成
http://api/product/Calc?id=1&first=1&second=2
和(或者)
http://api/product/1/Calc?first=1&second=2
返回正确的结果....我只是想知道我是否应该这样表示业务业务逻辑?或者我应该用另一种方式来做这件事,或者试着完全避免它?
这可能在很大程度上取决于您构建的系统。花点时间想想这将如何随着时间的推移而发展,因为这很难重构。你前进的方向看起来不错。
这个API调用
http://api/product/Calc?id=1&first=1&second=2
在我看来是正确的。所以你有一个Product
控制器,它有一个方法Calc
,并接受参数id
, first
和second
。
我不太确定如何处理这个API
http://api/product/1/Calc?first=1&second=2
对我来说,它读一个Product
有许多ids
,每个id
都可以调用一个带参数first
和second
的方法Calc
。也许在你的业务领域是有意义的,我只是看不出来。
理论上,REST不应该处理逻辑,而应该只处理状态(REST =具象状态传输)。
当然,我明白你的意思,如果我需要计算值该怎么办?
在我看来,你应该尽量避免它。如果这是不可能的,我将只是暴露一个ViewModel,它代表你的对象的状态,并保持模型与逻辑从外部世界隐藏。这保证了您执行显式转换,并且还显式声明您正在发送对象的状态,而不是对象本身。
但这基本上取决于情况,没有真正的硬性规定。我想说的是,现在最合理的方式就可以了。如果您发现它变得笨拙,请重构它以获得更好的解决方案。