在web api中公开域逻辑

时间:2013-05-09 19:29:51

标签: c# .net asp.net-web-api

所以在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

这会返回正确的结果....我只是想知道这是否应该代表业务逻辑?或者我应该以不同的方式做这件事还是试图完全避免它?我欢迎有关如何改进这一点的任何想法......

2 个答案:

答案 0 :(得分:1)

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

此API调用

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

看起来对我来说。因此,您有一个Product控制器,其方法为Calc,并且接收参数idfirstsecond

我不太清楚如何处理这个API

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

对我而言,Productidsid,每个Calc都可以使用参数firstsecond调用方法{{1}} 。也许在你的业务领域它是有道理的,我只是没有看到它。

答案 1 :(得分:0)

好吧,从理论上讲,REST不应该处理逻辑,而应该处理状态(REST =代表性状态转移)。

当然,我可以看到你的观点,如果我需要计算值,该怎么办?

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

如果那是不可能的,我只会公开一个ViewModel,它代表你的对象的状态,并保持模型与外界隐藏的逻辑。这样可以确保您进行显式转换,并且还明确声明您要发送对象的状态而不是对象本身。

但它基本上取决于情况,并没有真正的硬性规则。我会说现在用最有意义的东西去。如果您发现它变得笨拙,请将其重构为更好的解决方案。