【问题标题】:Need httpcontext value in business layer业务层需要httpcontext值
【发布时间】:2013-07-03 14:52:13
【问题描述】:

我有一个 MVC4 项目,它调用了一个业务层方法,其当前签名如下:

businessObject.BusinessMethod(param1, param2, param3)

在这个业务层方法中,我现在需要从HttpContext.Current.Session["SomeSessionValue"] 属性中获取一些数据。

因此,我不想使用 Resharpers 重构功能添加另外两个参数,而是想将所有这三个参数组合到一个对象中,并将签名重命名如下

businessObject.BusinessMethod(myParametersObject)

此业务层方法在整个解决方案中都使用,并且是经过测试的代码。如果我使用 resharper 来修改方法签名,我现在需要在调用方法 businessObject.BusinessMethod(myParametersObject) 之前将 param1、param2、param3 的值分配给 MyParameters 类的对象中的各个属性。

我需要在 2000 多个地方进行此更改。有没有更快的方法来做出这种改变?我不想到处手动更改代码或将 HttpContext 添加到业务层。一些 OOP 技术可以帮助我吗?

谢谢。

【问题讨论】:

  • 所有 2000 次调用都依赖于会话变量吗?否则,只需为执行此操作的调用创建一个新的重载。
  • 重载是多参数地狱的方式,在 C# 4 中完全没有必要,因为你可以使用默认参数值
  • 虽然您可能是对的,但维护通常不是理想的情况。无论如何,默认参数是重载的语法糖,各有优缺点。
  • 是的。所有调用都需要将会话值发送到业务层。他们不能有默认值。他们每个人都需要从会话中获取值。

标签: c# asp.net-mvc oop c#-4.0 asp.net-mvc-4


【解决方案1】:

使用 HttpContext 对象来传递全局对象是个坏主意。通常,业务层甚至不应该引用 System.Web。

Resharper 具有“Extract Class from Parameters ...”重构功能,可以自动化您描述的内容。您可以通过右键单击方法名称并选择 Refactor > Extract > Extract Class from Parameters 来访问它。然后,您可以选择要包含在类中的参数。

Resharper 将更新对方法的所有引用以创建和使用新类。

在任何情况下,超过 3 或 4 个参数是一种代码异味,表明该方法可能试图做太多事情。当您越过该阈值时,就该更改您的设计并合并参数或拆分方法了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-29
    • 2011-09-09
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    相关资源
    最近更新 更多