2009-04-09 4 views

Trả lời

33

Tôi muốn sử dụng tiêm phụ thuộc và chuyển thể hiện của HttpContext (hoặc chỉ phiên) cho lớp cần quyền truy cập vào Phiên. Một lựa chọn khác là tham khảo HttpContext.Current, nhưng điều đó sẽ làm cho nó khó kiểm tra hơn vì nó là một đối tượng tĩnh.

public ActionResult MyAction() 
    { 

     var foo = new Foo(this.HttpContext); 
     ... 
    } 


    public class Foo 
    { 
     private HttpContextBase Context { get; set; } 

     public Foo(HttpContextBase context) 
     { 
      this.Context = context; 
     } 

     public void Bar() 
     { 
      var value = this.Context.Session["barKey"]; 
      ... 
     } 
    } 
+1

Cảm ơn bạn đã trả lời. Có vẻ như có một vài khung công tác Dependency Injection. Bạn đề xuất khung DI nào? Có phải đọc các bài viết về DI không? :) – xraminx

+1

điều này có vẻ quá phức tạp đối với những gì mà áp phích gốc đã yêu cầu. –

+1

@xraminx - đừng nhầm lẫn giữa những gì tôi đề xuất với khung DI. Tôi đang nói về việc sử dụng DI, mô hình, không phải là một khuôn khổ. Ý tưởng là bạn chuyển một thể hiện của sự phụ thuộc vào lớp chứ không phải là nó tạo ra một hoặc sử dụng một cá thể tĩnh. Dễ dàng hơn nhiều để kiểm tra đơn vị thông qua chế nhạo. – tvanfosson

0

đã không thực hiện nó bản thân mình, nhưng mẫu này từ blog Chad Meyer có thể giúp (từ bài đăng này: http://www.chadmyers.com/Blog/archive/2007/11/30/asp.net-webforms-and-mvc-in-the-same-project.aspx)

[ControllerAction] 
public void Edit(int id) 
{ 
    IHttpSessionState session = HttpContext.Session; 

    if (session["LoggedIn"] == null || ((bool)session["LoggedIn"] != true)) 
     RenderView("NotLoggedIn"); 

    Product p = SomeFancyDataAccess.GetProductByID(id); 

    RenderView("Edit", p); 
} 
20

Bạn chỉ cần gọi nó qua HttpContext như vậy:

HttpContext.Current.Session["MyValue"] = "Something"; 
+1

@Nick - thử kiểm tra đơn vị bằng cách nhô ra HttpContext tĩnh và xem mức độ dễ dàng như thế nào. Tôi đã làm nó - không, cảm ơn. – tvanfosson

+2

FYI - có một lý do tại sao các nhà thiết kế khung giới thiệu HttpSessionStateBase và HttpContextBase vào các phiên bản mới hơn của khung công tác và tại sao bạn có thể thay đổi HttpContext trong một bộ điều khiển bằng cách sửa đổi bối cảnh của trình điều khiển. Nó giúp đơn vị kiểm tra hành động của bạn dễ dàng hơn nhiều. – tvanfosson

+14

Áp phích gốc không bao giờ được hỏi về thử nghiệm. Anh hỏi làm thế nào anh có thể truy cập phiên. –

0

Tôi cũng sẽ bao gồm tất cả các biến phiên vào một tệp lớp duy nhất. Bằng cách đó bạn có thể sử dụng intelliSense để chọn chúng. Điều này cắt giảm số lượng các dấu cách trong mã mà bạn cần phải xác định "chuỗi" cho phiên.

1

Đây là phiên bản của giải pháp cho sự cố này. Chú ý rằng tôi cũng sử dụng một dependency injection là tốt, sự khác biệt lớn duy nhất là "phiên" đối tượng được truy cập ném một Singleton

private iSession _Session; 

private iSession InternalSession 
{ 
    get 
    { 

     if (_Session == null) 
     {     
      _Session = new SessionDecorator(this.Session); 
     } 
     return _Session; 
    } 
} 

Đây là lớp SessionDecorator, trong đó sử dụng một mô hình trang trí quấn phiên quanh một giao diện:

public class SessionDecorator : iSession 
{ 
    private HttpSessionStateBase _Session; 
    private const string SESSIONKEY1= "SESSIONKEY1"; 
    private const string SESSIONKEY2= "SESSIONKEY2"; 

    public SessionDecorator(HttpSessionStateBase session) 
    { 
     _Session = session; 
    } 

    int iSession.AValue 
    { 
      get 
     { 
      return _Session[SESSIONKEY1] == null ? 1 : Convert.ToInt32(_Session[SESSIONKEY1]); 
     } 
     set 
     { 
      _Session[SESSIONKEY1] = value; 
     } 
    } 

    int iSession.AnotherValue 
    { 
     get 
     { 
      return _Session[SESSIONKEY2] == null ? 0 : Convert.ToInt32(_Session[SESSIONKEY2]); 
     } 
     set 
     { 
      _Session[SESSIONKEY2] = value; 
     } 
    } 
}` 

Hope this helps :)