0

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

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

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

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

哪种模式最适合这种情况?你如何解决同样的问题?

4

2 回答 2

0

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

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

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

更新

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

于 2012-04-09T11:03:41.687 回答
0

依赖注入将在这里为您提供帮助。采用任何依赖注入框架并将其与您的 MVC 应用程序集成。例如,要将 Ninject 集成到您的 MVC 应用程序中,请参阅此博客文章

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

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

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

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

于 2012-04-09T11:55:17.077 回答