【问题标题】:Add simple business logic to repository in ASP>NET MVC 3 C#在 ASP>NET MVC 3 C# 中向存储库添加简单的业务逻辑
【发布时间】:2011-04-07 12:40:25
【问题描述】:

我有一个问题,该问题在 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";
    }
}

【问题讨论】:

    标签: c# asp.net-mvc-3 refactoring repository-pattern design-decisions


    【解决方案1】:

    不推荐。

    现在关于lminThreshold 的存储库如何?如果这个值本身需要来自查找表或配置文件怎么办?

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

    【讨论】:

    • @Aliostad:您认为 MVC 应用程序中的业务层是什么?尽管很多人将控制器与业务服务层混淆,但我通常更愿意将模型视为业务服务层(根据COMBINE 4+2 层)。因此,我认为 EF + 存储库类,当然还有控制器,作为业务服务层。你能告诉我你的解释吗?谢谢
    • 业务层位于存储库和控制器之间。您可能不一定需要,但这种操作(转换值)适用于业务层组件。您可以将它放在控制器中,但如果您需要将它放在多个控制器中怎么办?
    • @Aliostad:那么您会考虑将 Repository 类作为业务层的一部分吗?如果没有,您会创建:1) 一组类(业务层),其方法暴露给应用程序中的每个控制器 2) 从 Repository 类获取数据,该类将方法暴露给业务层并从 3) EF 从 4) 数据库中获取数据?那是对的吗?谢谢
    • 你在说什么需要另一个问题。
    • @Aliostad:对不起,所以我限制了这个问题:您会考虑将 Repository 类作为业务层的一部分吗?我问你这个是因为我不知道你说存储库、实际存储库(数据库)或存储库类时指的是什么
    【解决方案2】:

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

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

    【讨论】:

    • EF 逻辑是什么意思? EF 是由 LINQtoSQL 从数据库中的数据自动生成的,我认为 EF 代表 DAL。阈值由另一个应用程序计算,对于我的应用程序,它们必须被视为存储在数据库中或将来从 Web 服务中获取。简而言之,您是否建议我将上述代码放在 Repository 类中?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2013-09-23
      • 2013-07-05
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      • 2011-05-01
      • 2021-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多