2012-04-09 60 views
0

我目前有一种类型,我注入到我的控制器,用于获取和设置会话数据。消除静态属性 - 我可以使用哪些模式?

我使用这个,所以我可以获得相关的会话信息为_sessionData.Username而不是使用Session["username"]

我想在所有的视图中使用这个会话信息和而以前这通过使SessionData成员,而不是静态的SessionData类注射到我的控制器做到了这一点。

我想避免使用静态成员以及具有与对象传递给每个控制器中图。

什么模式最适合这种类型的场景?你如何解决这个问题?

回答

0

为什么不直接使用Session [ “用户名”]?你可以用静态调用在一个实例是这样的:

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

你获得,然后可以在测试被嘲笑实例的维护和灵活性,而无需重新

改写会话类UPDATE

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

+0

我更喜欢在会话中确切地知道我可以访问的内容,而不是使用魔术键字符串。我的SessionData类几乎完成了你上面的方法。问题是,如何在不使其静态的情况下在我的视图中使用它? – 2012-04-09 11:13:13

+0

@JamieDixon对不起,我错过了,并更新了我的答案。 – 2012-04-09 11:26:39

+0

谢谢贾斯汀。到目前为止,我所知道的所有解决方案似乎都非常优雅。访问静态类成员,使用魔术字符串直接访问会话对象,在视图中创建对象。必须有一种更优雅的方式来访问大量视图中的共享信息。也许使用基本控制器将自定义Session类插入到每个请求的视图包中。 – 2012-04-09 11:37:28

0

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

一旦你整合你应用程序的DI框架。使用DI框架注册SessionData类。根据您的场景选择SessionData类的有效生存期。如果你看看这些DI框架,他们提供多种生命周期配置,例如每个呼叫实例,每个会话,单例。

现在注入任何你想去的地方SessionData依赖。对于控制器,你可以创建一个包含这种依赖作为公共财产BaseController如

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

对于你需要看看路过strongly typed model视图的一部分。这个过程在这里是类似的。创建一个BaseModel,在这里保留一个SessionData属性,DI框架应该完成剩下的工作。这里的最后一步是将此模型传递给每个呈现的视图。

+0

请参阅我的回答和评论,这是已经建议,OP是不满意的。 – 2012-04-09 11:56:19

+0

谢谢@Chandermani。我已经在使用依赖注入,正如Justin所说,他已经介绍了将数据传递给视图的大多数已知方法。如果您想了解更多信息,请查看我对他答案的评论。我的问题可能有点不清楚。 – 2012-04-09 12:11:49

相关问题