Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ASP中将简单业务逻辑添加到存储库>;NETMVC3C#_C#_Asp.net Mvc 3_Refactoring_Repository Pattern_Design Decisions - Fatal编程技术网

在ASP中将简单业务逻辑添加到存储库>;NETMVC3C#

在ASP中将简单业务逻辑添加到存储库>;NETMVC3C#,c#,asp.net-mvc-3,refactoring,repository-pattern,design-decisions,C#,Asp.net Mvc 3,Refactoring,Repository Pattern,Design Decisions,我有一个关于stackoverflow中已经有过多次争议的问题(对此我深表歉意),但由于主题的主观性,从一个案例到另一个案例都没有给出一般性的答案:我们可以根据存储库模式向存储库层添加业务逻辑吗? 我有一个带有ViewModels的MVC 3应用程序(这意味着我根本不使用ViewData)。该模型是一个连接到数据库的LinqtoSQL EF。目前,我直接从包含所有业务逻辑的控制器访问实体,并将视图所需的数据包装在特定的ViewModels中。 现在我开始重构,我意识到,除了优化ViewModel

我有一个关于stackoverflow中已经有过多次争议的问题(对此我深表歉意),但由于主题的主观性,从一个案例到另一个案例都没有给出一般性的答案:我们可以根据存储库模式向存储库层添加业务逻辑吗? 我有一个带有ViewModels的MVC 3应用程序(这意味着我根本不使用ViewData)。该模型是一个连接到数据库的LinqtoSQL EF。目前,我直接从包含所有业务逻辑的控制器访问实体,并将视图所需的数据包装在特定的ViewModels中。 现在我开始重构,我意识到,除了优化ViewModels之外,避免代码重复的最佳方法是将所有查询委托给一个与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";
    }
}
if(litem.Ascending==true)
{
if(lprojectionPercactualValuelminThreshold&&lprojectionperactualvalue=项的最大阈值)
{
lcolor=“绿色”;
}
}
其他的
{
if(lprojectionperactualvalue>lminThreshold)
{
lcolor=“红色”;
}
else if(lprojectionperactualvaluelmedThreshold)
{
lcolor=“黄色”;
}

else/(percValue不建议使用

存储库现在如何处理
lminThreshold
?如果该值本身需要来自查找表或配置文件,该怎么办


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

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


在这一点上,您只检查lprojectionPercactualValue是否超过某个treshold,但如果在某一点上,您需要以某种奇特的方式计算该treshold,或者您决定执行某种验证或其他类似的事情,会怎么样呢?这些都是特定于域的决策,它们应该位于自己的层中

IMHO,您最好在控制器和存储库之间添加一个业务层,并将上面的getColor代码放到业务层中(如果需要,甚至可以将其分解为多个方法)如果你在其他控制器中需要它,如果它不再是一个简单的I/O,如果你必须从一个Web服务中获取阈值值,如果你想在你的控制器或仓库代码中做所有这些改变?如果你想在MVC应用程序中做业务层的话,你会怎么想呢?Aliostad:你认为MVC应用程序中的业务层是什么?虽然很多人混淆了具有业务服务层的e-控制器,我通常倾向于将模型视为业务服务层(根据层)因此,我认为EF+存储库类,当然是控制器,作为业务服务层。请您告诉我您的请求是什么?感谢业务层是介于存储库和控制器之间的。您可能不需要一个,但是这种操作(翻译值)。适用于业务层组件。您可以把它放到控制器中,但是如果您需要它在多个控制器中呢?@ Aliostad:那么您会考虑业务层的存储库类的一部分吗?如果没有,您会创建:1)一组类(业务层)。将方法公开给应用程序中从存储库类获取数据的每个控制器,该存储库类将方法公开给业务层,并从从从数据库获取数据的EF获取数据?是否正确?谢谢你所说的还需要另一个问题。@Aliostad:抱歉,所以我限制了这个问题:你会继续吗考虑到业务层的存储库类部分吗?我问你这个问题是因为我不知道你在说存储库时指的是什么,实际的存储库(db)或者存储库类EF逻辑是什么意思?EF由LINQtoSQL根据数据库中的数据自动生成,我认为EF代表DAL。阈值由另一个应用程序计算,对于我的应用程序,它们必须被视为存储在数据库中或将来从web服务获取.简而言之,您是否建议我将上述代码放入存储库类中?