2010-01-09 40 views
6

Xin lỗi tôi nếu câu hỏi này đã được yêu cầu. HttpContext.Current.Session["key"] trả về một đối tượng và chúng tôi sẽ phải đưa nó đến Type cụ thể trước khi chúng tôi có thể sử dụng nó. Tôi đã nhìn vào hiện thực khác nhau của phiên gõphiên đánh máy mạnh mẽ trong asp.net

http://www.codeproject.com/KB/aspnet/typedsessionstate.aspx http://weblogs.asp.net/cstewart/archive/2008/01/09/strongly-typed-session-in-asp-net.aspx http://geekswithblogs.net/dlussier/archive/2007/12/24/117961.aspx

và tôi cảm thấy rằng chúng tôi cần thêm một số mã hơn (chính xác cho tôi nếu tôi là sai) để SessionManager nếu chúng ta muốn thêm một new Type của đối tượng vào phiên, hoặc là một phương thức hoặc như một trình bao bọc riêng biệt. Tôi nghĩ chúng ta có thể sử dụng Generics

public static class SessionManager<T> where T:class 
{ 
    public void SetSession(string key,object objToStore) 
    { 
    HttpContext.Current.Session[key] = objToStore; 
    } 

    public T GetSession(string key) 
    { 
    return HttpContext.Current.Session[key] as T; 
    } 

} 
  • Có lợi thế vốn có trong sử dụng

    SessionManager<ClassType>.GetSession("sessionString")

vì sử dụng

HttpContext.Current.Session["sessionString"] as ClassType 
  • Tôi cũng đã suy nghĩ nó sẽ được tốt đẹp có cái gì đó như

SessionManager["sessionString"] = objToStoreInSession, nhưng phát hiện ra rằng một lớp tĩnh không thể có một indexer. Có cách nào khác để đạt được điều này không?

  • suy nghĩ của tôi là tạo ra một SessionObject mà sẽ lưu trữ các Type và đối tượng, sau đó thêm đối tượng này đến phiên (sử dụng một SessionManager), với chìa khóa. Khi truy xuất, truyền tất cả các đối tượng đến SessionObject, nhận loại (nói t) và đối tượng (nói obj) và truyền obj làm t và trả lại.

    public class SessionObject { public Type type {get;set;} public Object obj{get;set;}
    }

này sẽ không hoạt động tốt (như chữ ký trở lại sẽ là như nhau, nhưng các loại trở lại sẽ khác nhau).

Có cách nào tao nhã khác của tiết kiệm/lấy đối tượng trong phiên một cách an toàn loại nhiều cách

Trả lời

4

Để biết cách xử lý rất gọn gàng, bảo trì và khéo léo với Phiên, hãy xem post này. Bạn sẽ ngạc nhiên vì nó đơn giản như thế nào.

+0

mặc dù một bài tốt, phát sinh lớp học của bạn từ một buổi học cụ thể sẽ không cho phép bạn lấy được lớp học của bạn từ bất kỳ lớp trừu tượng khác/base class – ram

+0

@Ram yes, điểm của lớp trong bài viết của tôi là nó là một trình bao bọc cho bất kỳ mục nào bạn muốn lưu trữ trong phiên làm việc. Và như tôi hy vọng bạn nhận thấy, nó thực sự không thể dễ dàng hơn. – TheObjectGuy

+1

Nó sẽ thực sự làm việc cho ra khỏi nhà nước proc? Vì đối tượng phiên không bao giờ được viết trở lại kho lưu trữ phiên, do đó, kho lưu trữ phiên sẽ vẫn có các giá trị đã được tuần tự hóa trước đây trong đó. –

1

Trên thực tế, nếu bạn đang tìm kiếm để gõ các đối tượng, đặt loại ở cấp phương pháp như:

public T GetValue<T>(string sessionKey) 
{ 

} 

Cấp lớp cao hơn nếu bạn có cùng một đối tượng trong phiên, nhưng phiên có thể mở rộng thành nhiều loại. Tôi không biết rằng tôi sẽ lo lắng về việc kiểm soát phiên; Tôi sẽ chỉ để cho nó làm những gì nó được thực hiện trong một thời gian, và chỉ đơn giản là cung cấp một phương tiện để trích xuất và lưu thông tin trong một thời trang mạnh mẽ hơn gõ (ít nhất là cho người tiêu dùng).

Có, các chỉ mục sẽ không hoạt động; bạn có thể tạo ra nó như là một ví dụ thay vào đó, và làm cho nó tĩnh bởi:

public class SessionManager 
{ 
    private static SessionManager _instance = null; 


    public static SessionManager Create() 
    { 
     if (_instance != null) 
      return _instance; 

     //Should use a lock when creating the instance 
     //create object for _instance 

     return _instance; 
    } 

    public object this[string key] { get { .. } } 
} 

Và vì vậy đây là việc thực hiện nhà máy tĩnh, nhưng nó cũng duy trì một điểm duy nhất tiếp xúc qua một tham chiếu tĩnh để các lớp quản lý phiên nội bộ . Mỗi phương thức trong sessionmanager có thể gói phiên ASP.NET hiện tại, hoặc sử dụng bộ nhớ trong của riêng bạn.

2

Một nhược điểm của kỹ thuật là mã tiêu thụ cần phải nhận thức được những phím nào để sử dụng để lưu trữ và truy xuất. Điều này có thể dễ bị lỗi, vì khóa cần phải chính xác, nếu không bạn có nguy cơ lưu trữ ở vị trí sai hoặc nhận được giá trị null.

Tôi thực sự sử dụng biến thể được nhập mạnh mẽ, vì tôi biết những gì tôi cần có trong phiên và do đó có thể thiết lập lớp gói cho phù hợp. Tôi đã có thêm mã trong lớp phiên, và không phải lo lắng về các chuỗi khóa ở bất kỳ đâu.

+0

Yup, đồng ý với bạn. Tôi thấy rằng việc thiết lập SessionManager.Constants cho chuỗi phiên làm việc triển khai chuẩn để tránh lỗi chính tả – ram

2

Bạn có thể chỉ cần sử dụng mẫu đơn cho đối tượng phiên của mình. Bằng cách đó bạn có thể lập mô hình toàn bộ phiên của mình từ một đối tượng cấu trúc tổng hợp duy nhất. Bài viết này đề cập đến những gì tôi đang nói về và thảo luận về những đối tượng Session như một đối tượng yếu gõ: http://allthingscs.blogspot.com/2011/03/documenting-software-architectural.html

0

tôi đăng một giải pháp về vấn đề StackOverflow is it a good idea to create an enum for the key names of session values?

Tôi nghĩ rằng đó là sự trơn tru và chứa rất ít mã để làm cho nó xảy ra. Nó cần .NET 4.5 để trở thành slickest, nhưng vẫn có thể với các phiên bản cũ hơn.

Nó cho phép:

int myInt = SessionVars.MyInt; 
SessionVars.MyInt = 3; 

để làm việc chính xác như:

int myInt = (int)Session["MyInt"]; 
Session["MyInt"] = 3; 
Các vấn đề liên quan