일반적으로이 키를 세션 키로 사용하고 필요에 따라 개체를 명시 적으로 추가합니다. 그 이유는 깨끗한 방법이므로 세션의 오브젝트 수를 최소한으로 유지하려고합니다.
이 특별한 접근 방식은 양식 인증과 사용자 세션을 한 곳으로 모으기 때문에 개체를 추가하고 잊어 버릴 수 있습니다. 인수는 큰 장황함을 나타낼 수 있지만 두 배의 증가를 방지하고 세션 중에 너무 많은 객체를 가져서는 안됩니다.
다음은 코어 라이브러리 또는 원하는 곳에서 존재할 수 있습니다. 명시 적으로 선언
public class CurrentSession : MySession<PublicUser>
{
public static CurrentSession Instance = new CurrentSession();
protected override PublicUser LoadCurrentUser(string username)
{
// This would be a data logic call to load a user's detail from the database
return new PublicUser(username);
}
// Put additional session objects here
public const string SESSIONOBJECT1 = "CurrentObject1";
public const string SESSIONOBJECT2 = "CurrentObject2";
public Object1 CurrentObject1
{
get
{
if (Session[SESSIONOBJECT1] == null)
Session[SESSIONOBJECT1] = new Object1();
return Session[SESSIONOBJECT1] as Object1;
}
set
{
Session[SESSIONOBJECT1] = value;
}
}
public Object2 CurrentObject2
{
get
{
if (Session[SESSIONOBJECT2] == null)
Session[SESSIONOBJECT2] = new Object2();
return Session[SESSIONOBJECT2] as Object2;
}
set
{
Session[SESSIONOBJECT2] = value;
}
}
}
마침내 큰 장점 :
/// <summary>
/// Provides a default pattern to access the current user in the session, identified
/// by forms authentication.
/// </summary>
public abstract class MySession<T> where T : class
{
public const string USERSESSIONKEY = "CurrentUser";
/// <summary>
/// Gets the object associated with the CurrentUser from the session.
/// </summary>
public T CurrentUser
{
get
{
if (HttpContext.Current.Request.IsAuthenticated)
{
if (HttpContext.Current.Session[USERSESSIONKEY] == null)
{
HttpContext.Current.Session[USERSESSIONKEY] = LoadCurrentUser(HttpContext.Current.User.Identity.Name);
}
return HttpContext.Current.Session[USERSESSIONKEY] as T;
}
else
{
return null;
}
}
}
public void LogOutCurrentUser()
{
HttpContext.Current.Session[USERSESSIONKEY] = null;
FormsAuthentication.SignOut();
}
/// <summary>
/// Implement this method to load the user object identified by username.
/// </summary>
/// <param name="username">The username of the object to retrieve.</param>
/// <returns>The user object associated with the username 'username'.</returns>
protected abstract T LoadCurrentUser(string username);
}
}
그런 다음 프로젝트의 루트 네임 스페이스 다음 클래스에서이를 구현 (나는 보통 MVC 프로젝트에 코드 폴더에 넣어) 세션에서 원하는 것은보기를 포함하여 MVC 응용 프로그램에서이 위치를 절대적으로 참조 할 수 있다는 것입니다. 그냥 그것을 참조 : 무슨 일이 일어나고 있는지 조금 다른 방법보다 덜 일반적인, 그러나 정말 정말 선택을 다시
CurrentSession.Instance.Object1
CurrentSession.Instance.CurrentUser
, 다른 담합이나 의존성 주입과 100 % 요청 컨텍스트에 안전합니다.
또 다른 주목할 점은 협동 식 접근법이 멋지지만 여전히 참고 자료로 모든 곳에서 문자열을 사용한다는 것입니다. 열거 형 (enums) 등으로 장비를 조작 할 수는 있지만 위의 방법을 강하게 타자를 치고 설정하고 잊어 버리는 편이 낫습니다.
두 개 이상의 컨트롤러에 동일한 유형을 전달하면 어떻게 될까요? 한 세션이 다른 세션을 덮어 씁니 까? –
아니요, 둘 다 동일한 유형 이름을 가지므로 동일한 세션 키를 갖게됩니다. 세션 객체는 대체되지 않고 두 컨트롤러에서 동일한 객체가됩니다. –
기본 컨트롤러가 필요없고보기 코드에서도 세션에 액세스 할 수있는 응답이 아래에 추가되었습니다. – Gats