asp.net mvc 3 -在asp.net mvc 3 c#中向存储库添加简单的业务逻辑

本文关键字:asp mvc net 简单 添加 业务 存储 | 更新日期: 2023-09-27 17:48:59

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

的方法。
public string getColor (int ItemId, float lprojectionPercactualValue);

方法需要ItemId,以便检索特定于该Item的值。你对这个设计决策有什么看法?将代码留在控制器中,移动到仍然在控制器中的另一个方法(创建一个方法甚至一个专用的类)还是将其移动到所解释的存储库中更好?

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";
    }
}

asp.net mvc 3 -在asp.net mvc 3 c#中向存储库添加简单的业务逻辑

不建议使用。

Repository现在对lminThreshold有什么看法?如果这个值本身需要来自查找表或配置文件,该怎么办?

将其移动到业务层-如果没有业务层,则移动到控制器

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

此时,您只检查lprojectionPercactualValue是否超过了某个阈值,但是,如果在某些时候,您需要以某种奇特的方式计算该阈值,或者您决定执行某种验证或其他类似的事情呢?

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