C# 在MVC4和类库之间共享会话的最佳方式

C# 在MVC4和类库之间共享会话的最佳方式,c#,asp.net,asp.net-mvc-4,session-variables,C#,Asp.net,Asp.net Mvc 4,Session Variables,背景: ASP.NET会话状态使您能够在用户在Web应用程序中导航ASP.NET页面时存储和检索用户的值。这适用于该应用程序,但当我们在该应用程序中引用了一个类库,并且需要该库中的会话变量时,我必须将其传递给每个方法,因为我没有使用依赖项注入 问题: 我有一个控制器,它执行Facebook身份验证,如下所示: public class FacebookController : Controller { private FacebookGateway FacebookGa

背景:

ASP.NET会话状态使您能够在用户在Web应用程序中导航ASP.NET页面时存储和检索用户的值。这适用于该应用程序,但当我们在该应用程序中引用了一个类库,并且需要该库中的
会话变量
时,我必须将其传递给每个方法,因为我没有使用依赖项注入

问题:

我有一个控制器,它执行Facebook身份验证,如下所示:

 public class FacebookController : Controller
    {
        private FacebookGateway FacebookGateway = new FacebookGateway();

        // GET: /Facebook/

        public ActionResult Index()
        {
            string code = Request.QueryString["code"];
            TokenResponse tokenResponse = FacebookGateway.GetTokenResponse(code);
            Session["AccessToken"] = tokenResponse.Access_token;
            return View();
        }

        public ActionResult Friends()
        {

            string accessToken = Session["AccessToken"].ToString();

            WebRequest request = WebRequest.Create(instanceUrl + @"profileUrl-Here");
            request.Method = "GET";
            request.Headers.Add("Some Header " + accessToken);
            WebResponse response = request.GetResponse();
            string str = String.Empty;

            if (response == null)
            {
            }
            else
            {
                using (StreamReader sr = new StreamReader(response.GetResponseStream()))
                    str = sr.ReadToEnd().Trim();

            }
           //Convert str to Model
            return View(model);
        }
在这里,在几乎每种方法中,我都需要从Facebook Graph API访问数据的访问令牌,但是,我每次都必须从会话中获取它,如下所示

 var accessToken = Session["AccessToken"].ToString();
如何使其可用于控制器中的所有方法?

有没有办法在MVC和类库之间共享会话,而不在类库的每个方法调用中传递
HttpContext.session

注意: 我已经看到了,但不太清楚它如何在类库中也可用。

与(您提到的)相关:

您可以将会话包装器(即
MySession
class)放入类库中。这样,类库中的代码以及web应用程序中的代码都可以使用它


通常,您可以使用
System.Web.HttpContext.Current.session[“AccessToken”]
从任何地方访问会话状态。即使没有任何包装器类,这也能起作用。

听起来,在类库和MVC应用程序之间添加一个抽象级别会让您受益匪浅。这样做将允许您将必要的信息从MVC应用程序传递到库,而库实际上不知道如何从会话本身读取它。您的库的用途是什么&它做什么?@AkashKava它真的需要吗?如果我创建此包装类,我如何将值放入会话中?我是否应该用同样的方法在会话中分配或存储值?@BhushanFirake:只需使用
MySession
类的属性即可。您可以获取并设置它们,例如,
MySession.AccessToken=tokenResponse.Access_token
因此,如果我必须在控制器的许多方法中使用此类,我必须将其设置为该控制器的专用类。对吧?只是好奇你的第二句话:“你可以从任何地方访问会话状态”。我的类库必须有一个对
System.Web
的引用,如果我想这样做,或者有解决方法?@BhushanFirake:您可以创建一个基本控制器,现在创建受保护的属性来访问会话值。最后,您的控制器将从基本控制器派生。混乱