在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

返回正确的结果....我只是想知道我是否应该这样表示业务业务逻辑?或者我应该用另一种方式来做这件事,或者试着完全避免它?

在webapi中公开域逻辑

这可能在很大程度上取决于您构建的系统。花点时间想想这将如何随着时间的推移而发展,因为这很难重构。你前进的方向看起来不错。

这个API调用

http://api/product/Calc?id=1&first=1&second=2

在我看来是正确的。所以你有一个Product控制器,它有一个方法Calc,并接受参数id, firstsecond

我不太确定如何处理这个API

http://api/product/1/Calc?first=1&second=2

对我来说,它读一个Product有许多ids,每个id都可以调用一个带参数firstsecond的方法Calc。也许在你的业务领域是有意义的,我只是看不出来。

理论上,REST不应该处理逻辑,而应该只处理状态(REST =具象状态传输)。

当然,我明白你的意思,如果我需要计算值该怎么办?

在我看来,你应该尽量避免它。

如果这是不可能的,我将只是暴露一个ViewModel,它代表你的对象的状态,并保持模型与逻辑从外部世界隐藏。这保证了您执行显式转换,并且还显式声明您正在发送对象的状态,而不是对象本身。

但这基本上取决于情况,没有真正的硬性规定。我想说的是,现在最合理的方式就可以了。如果您发现它变得笨拙,请重构它以获得更好的解决方案。