我有一个问题已经在stackoverflow中多次提出异议(我为此道歉)但由于主题从一个案例到另一个案例的主观性,因此没有给出一般答案:我们可以添加业务吗?根据存储库模式的存储库层的逻辑? 我有一个使用ViewModel的MVC 3应用程序(这意味着我根本不使用ViewData)。该模型是LinqtoSQL EF,当然连接到数据库。目前,我直接从包含所有业务逻辑的控制器访问实体,并在特定的ViewModel中包装视图所需的数据。 现在我开始重构,我意识到除了优化ViewModel之外,避免代码重复的最好方法是将所有查询委托给与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";
}
}
答案 0 :(得分:0)
不推荐。
现在如何存储有关lminThreshold
的存储库?如果此值本身需要来自查找表或配置文件,该怎么办?
将其移至业务层 - 如果没有,则移至控制器。
答案 1 :(得分:0)
将EF逻辑包装在您通过Repository类代理的DAL层中。这是原始数据,由于您需要对其进行额外的处理,因此建议使用服务层来使用它并在其上应用自定义业务规则。这里的存储库旨在阻止任何数据库代码重复。
此时,您只检查lprojectionPercactualValue是否超过某个阈值,但是如果在某些时候您需要以某种奇特的方式计算该阈值,或者您决定执行某种验证或其他事情,该怎么办?像那样。这些都是特定于域的决策,它们应该位于自己的层中。
答案 2 :(得分:0)
恕我直言,你最好在控制器和存储库之间添加一个业务层,并将你的getColor代码放在业务层中(如果需要,甚至可以将它分成几个方法),如果你需要在其他控制器中,如果它不再是简单的if / else,如果你明天必须从Web服务获取阈值,那么你想在控制器或存储库代码中进行所有这些更改吗?