1

我有一个关于在 stackoverflow 中已经多次争论的问题的问题(对此我深表歉意),但由于从一个案例到另一个案例的主题的主观性,从未给出一般性答案:我们可以将业务逻辑添加到根据存储库模式的存储库层?我有一个带有 ViewModels 的 MVC 3 应用程序(这意味着我根本不使用 ViewData)。该模型当然是连接到数据库的 LinqtoSQL EF。目前,我直接从包含所有业务逻辑的控制器访问实体,并将视图所需的数据包装在特定的 ViewModel 中。现在我开始重构,我意识到避免代码重复的最好方法,除了优化 ViewModel 之外,是将所有查询委托给与 EF 通信的存储库,并创建控制器使用的定制方法。现在,考虑到我希望存储库返回实际对象而不是表达式,我正在考虑将小块业务逻辑委托给存储库,以使我的代码更清晰。但是为了松耦合,我想听听你的意见。在下面显示的代码(当前位于控制器中)中,除了 lprojectionPercactualValue取自数据库。因此,我想将这段代码移动到存储库并调用带有签名的方法:

public string getColor (int ItemId, float lprojectionPercactualValue);

该方法需要ItemId才能检索特定于该项目的值。您如何看待这个设计决策?将代码留在控制器中,移动到仍在控制器中的另一个方法(创建一个方法甚至一个专用的类)还是按照解释将其移动到存储库中更好?

if (litem.Ascending == true)
{
    if (lprojectionPercactualValue < lminThreshold)
    {
        lcolor = "RED";
    }
    else if (lprojectionPercactualValue > lminThreshold && lprojectionPercactualValue < lmedThreshold)
    {                                   
        lcolor = "YELLOW";
    }
    else //(percValue >= item.Max_Threshold)
    {
        lcolor = "GREEN";
    }
}

else
{
    if (lprojectionPercactualValue > lminThreshold)
    {
        lcolor = "RED";
    }
    else if (lprojectionPercactualValue < lminThreshold && lprojectionPercactualValue > lmedThreshold)
    {
        lcolor = "YELLOW";
    }
    else //(percValue <= item.Max_Threshold)
    {
        lcolor = "GREEN";
    }
}
4

3 回答 3

0

不推荐。

Repository 现在怎么样了lminThreshold?如果这个值本身需要来自查找表或配置文件怎么办?

将其移至业务层 - 如果您没有,则移至控制器。

于 2011-04-07T12:44:42.467 回答
0

将您的 EF 逻辑包装在您通过 Repository 类代理的 DAL 层中。这是原始数据,由于您需要对其进行额外处理,因此建议您拥有一个使用它并在其上应用您的自定义业务规则的服务层。此处的存储库旨在阻止任何数据库代码重复。

此时,您只检查 lprojectionPercactualValue 是否超过某个阈值,但如果在某个时候,您需要以某种奇特的方式计算该阈值,或者您决定执行某种验证或其他类似的事情,该怎么办。这些都是特定领域的决策,它们应该位于它们自己的层中。

于 2011-04-07T12:57:40.377 回答
0

恕我直言,您最好在控制器和存储库之间添加一个业务层,并将上面的getColor代码放入业务层(如果需要,甚至将其分解为多个方法),如果您在其他控制器中需要它怎么办,如果它不再是简单的 if/else,如果您明天必须从 Web 服务获取阈值,您是否希望在控制器或存储库代码中进行所有这些更改?

于 2011-04-08T03:33:07.453 回答