2009-11-19 45 views
50

Đó là sự hiểu biết của tôi rằng hàm tạo cho bộ điều khiển không được gọi trong mỗi yêu cầu web. Giả sử điều này là đúng, vòng đời của bộ điều khiển là gì? Là "xây dựng" khi bắt đầu ứng dụng, sau đó được lưu trữ và gọi với requestcontext được chèn vào nó với mỗi yêu cầu web?Vòng đời điều khiển ASP.NET MVC

Chỉ cần rõ ràng, tôi không hỏi cách mô phỏng hành vi của hàm tạo, tôi sử dụng sự kiện OnActionExecuting để khởi tạo những thứ tôi thường làm trong một hàm tạo. Ngoài ra, tôi sử dụng các nhà xây dựng trên bộ điều khiển để kiểm tra đơn vị và hệ thống.

Cảm ơn!

Trả lời

74

Nếu bạn sử dụng default controller factory một phiên bản mới sẽ được xây dựng cho mỗi yêu cầu và đó là cách thực hiện. Bộ điều khiển không được chia sẻ giữa các yêu cầu khác nhau. Bạn có thể mặc dù viết một nhà máy tùy chỉnh quản lý tuổi thọ của bộ điều khiển.

+10

Tại sao? Tại sao? –

+2

Tôi đã say mê và tự dạy tại sao điều này xảy ra. Tôi đã tạo các bộ điều khiển với các hành động đọc/ghi và các khung nhìn sử dụng EF. Mã được tạo ra đã tạo ra một biến cá thể riêng cho cá thể EF Context. Tôi nghĩ tôi sẽ thông minh và biến nó thành một biến tĩnh. Vấn đề là nếu một cái gì đó bên ngoài phạm vi của bộ điều khiển này sửa đổi cơ sở dữ liệu, bối cảnh tĩnh không bao giờ biết. Bây giờ tôi để nó như một biến mẫu và vì một cá thể mới được tạo ra với mỗi yêu cầu, bối cảnh có thể thấy bất kỳ thay đổi nào đối với cơ sở dữ liệu. – ThatAintWorking

+1

Trong một API Web, nơi tất cả các trạng thái được chứa trong các tham số (nghĩa là một kiểu hàm) không có lý do gì (mà tôi có thể thấy) tại sao một bộ điều khiển không thể được sử dụng lại. Đó là chủ đề an toàn theo thiết kế. –

10

Tôi sợ, sự hiểu biết của bạn là sai. Một bộ điều khiển (mà phải là một lớp rất mỏng và nhẹ và không phải có bất kỳ trạng thái outliving session nào) thực sự được xây dựng trên bay cho mỗi và mọi yêu cầu web. Làm thế nào khác có thể một trường hợp điều khiển được cụ thể cho một cái nhìn nhất định?

Vì vậy, không có những điều như một "vòng đời" (khác hơn so với yêu cầu) ...

1

Một bộ điều khiển được tạo ra cho mỗi yêu cầu bạn làm. Cho phép lấy một ví dụ.

public class ExampleController : Controller{ 
      public static userName; 

      public void Action1(){//do stuff} 
      public void Action2(){//do stuff} 
      public void AssignUserName(string username){ 
       userName = username; 

      } 
      public string GetName(){ return userName;} 


    } 

Bây giờ bạn có thể gọi bộ điều khiển từ chế độ xem truyền tên người dùng. Đừng hy vọng sẽ nhận được userName mà bạn đã đặt trong yêu cầu tiếp theo. nó sẽ trả về null. Vì vậy, đối với mọi yêu cầu, một bộ điều khiển mới được tạo ra. Bạn không khởi tạo một bộ điều khiển ở bất cứ nơi nào trong MVC như bạn instatiate một đối tượng từ một lớp. Chỉ đơn giản là bạn không có con trỏ bộ nhớ đối tượng điều khiển để gọi nó như bạn làm với các đối tượng khác.

Đi tới liên kết này. Có một lời giải thích tốt về vòng đời của bộ điều khiển MVC.

ASP.Net MVC - Request Life Cycle

Các vấn đề liên quan