【问题标题】:Eliminating static properties - What patterns do I have at my disposal?消除静态属性——我可以使用哪些模式?
【发布时间】:2012-04-09 19:55:17
【问题描述】:

我目前有一种类型,我注入到我的控制器中,用于获取和设置会话数据。

我使用它是为了获取相关会话信息为_sessionData.Username,而不是使用Session["username"]

我想在我的所有视图中使用此会话信息,并且以前会通过将 SessionData 成员设为静态而不是将 SessionData 类注入我的控制器来完成此操作。

我想避免使用静态成员以及必须将对象传递给每个控制器中的视图。

什么模式最适合这种情况?您如何解决同样的问题?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 session c#-4.0


    【解决方案1】:

    为什么不直接使用 Session["username"]?您可以将静态调用包装在这样的实例中:

    public class MySessionClass
    {
        public string GetSessionValue(String value)
        {
            return Session[value];
        }
    }
    

    您获得实例的维护和灵活性,然后可以在测试中模拟,而无需重新重写 Session 类

    更新

    就在您的视图中使用您的实例而言,是什么阻止您编写代码块并对其进行更新和使用?您应该能够像 MVC 中的任何其他代码块一样针对它编写代码。 但是,我建议不要这样做,因为它违背了分层架构的目的。您可以像访问任何 HTML 页面一样直接访问会话,也可以将其作为对象从控制器传递。

    【讨论】:

    • 我更喜欢确切地知道我在会话中可以访问的内容,而不是使用魔术键字符串。我的 SessionData 类几乎与您上面的方法一样。问题是,如何在视图中使用它而不使其成为静态?
    • 谢谢贾斯汀。到目前为止,我所知道的解决方案都不是很优雅。访问静态类成员,使用魔术字符串直接访问会话对象,在视图中更新对象。必须有一种更优雅的方式来访问跨多个视图的共享信息。也许使用基本控制器将自定义 Session 类插入到每个请求的视图包中。
    • @JamieDixon 关于使用您的实例接收数据并将其传递给视图的其他建议呢?否则,您最终会将 UI 与逻辑混合在一起,您应该避免这种情况
    • 这是有道理的,但又显得有点不雅。以本页顶部的用户名为例。这可能来自共享视图 _Layout.cshtml 或类似视图。在每个控制器中传递这些数据似乎有点矫枉过正。
    • @JamieDixon 是的,他们可能正在为此使用静态会话。这是 UI 视图,它应该是无状态的,因此您只能在该上下文中访问静态值。我不认为它不优雅,因为否则,如前所述,您在 UI 中混合了太多逻辑
    【解决方案2】:

    依赖注入可以帮助你。采用任何依赖注入框架并将其与您的 MVC 应用程序集成。例如,要将 Ninject 集成到您的 MVC 应用程序中,请参见 blog post

    一旦您将 DI 框架与您的应用程序集成。向 DI 框架注册 SessionData 类。根据您的方案为 SessionData 类选择一个有效的生命周期。如果您查看这些 DI 框架,它们会提供多种生命周期配置,例如每次调用实例、每次会话、单例。

    现在在任何你想要的地方注入 SessionData 依赖。对于控制器,您可以创建一个包含此依赖项的 BaseController 作为公共属性,例如

    [Inject]
    public SessionData SessionContext {get;set;}
    

    对于查看部分,您需要查看传递的strongly typed model。这个过程在这里是相似的。创建一个 BaseModel,在此处保留一个 SessionData 属性,其余的由 DI 框架完成。这里的最后一步是将此模型传递给每个渲染的视图。

    【讨论】:

    • 请看我的回答和 cmets,这是已经提出的建议,OP 对此不满意。
    • 谢谢@Chandermani。我已经在使用依赖注入,正如贾斯汀已经说过的那样,他涵盖了大多数将数据传递到视图的已知方法。如果您想了解更多信息,请参阅我的 cmets 关于他的回答。我的问题可能有点不清楚。
    猜你喜欢
    • 2011-12-05
    • 1970-01-01
    • 2011-11-14
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    相关资源
    最近更新 更多