Tôi đã đi vòng với điều này kể từ khi tôi bắt đầu lập trình ASP 12 (hoặc hơn) năm trước và tôi chưa bao giờ tìm thấy giải pháp tuyệt vời vì kiến trúc ASP và ASP.NET luôn được một đầm lầy của thực hành xấu, ma thuật chia sẻ singletons, vv Vấn đề lớn nhất của tôi là với các đối tượng HttpApplication
với sự kiện không sự kiện của nó (Application_Start
, Application_End
, vv).Application_Start so với OnInit so với constructor
Nếu bạn muốn thực hiện một lần cho toàn bộ vòng đời của một ứng dụng HTTP, Application_Start
là nơi hiển nhiên để thực hiện. Đúng? Không chính xác. Thứ nhất, đây không phải là một sự kiện, nó là một quy ước đặt tên ma thuật, khi theo sau, khiến phương thức được gọi một lần cho mỗi AppDomain được tạo bởi IIS.
Bên cạnh các quy ước đặt tên ma thuật là một thực tế kinh khủng, tôi đã bắt đầu nghĩ rằng đó có thể là lý do tồn tại không có sự kiện như sự kiện Start
trên đối tượng HttpApplication
. Vì vậy, tôi đã thử nghiệm với các sự kiện tồn tại, chẳng hạn như Init
. Vâng, đây thực sự không phải là một sự kiện, đó là một phương pháp có thể ghi đè, đó là điều tốt nhất tiếp theo.
Dường như phương thức Init()
được gọi cho mọi sự khởi tạo của đối tượng HttpApplication
, điều này xảy ra nhiều hơn một lần cho mỗi AppDomain. Điều này có nghĩa rằng tôi cũng có thể chỉ cần đặt logic khởi động của tôi bên trong constructor của đối tượng HttpApplication
.
Bây giờ câu hỏi của tôi là, tại sao tôi không nên đặt logic khởi động của mình trong hàm tạo? Tại sao thậm chí còn tồn tại Init()
và tôi có cần quan tâm đến Application_Start
không? Nếu tôi làm, bất cứ ai có thể giải thích tại sao không có sự kiện thích hợp hoặc phương pháp overridable cho sự kiện giả này trong đối tượng HttpApplication
?
Và bất cứ ai có thể giải thích cho tôi lý do tại sao trong một ứng dụng ASP.NET điển hình, 8 trường hợp của HttpApplication
của tôi được tạo ra (nguyên nhân gây dựng và Init
để chạy nhiều lần, tất nhiên; một boolean tĩnh được chia sẻ được gọi là initialized
) khi ứng dụng của tôi chỉ có một AppDomain duy nhất?
Có lẽ cần phải được thực hiện trong Application_Start để khung có thể thiết lập tất cả các đối tượng được chia sẻ ma thuật đó. Có lẽ lớp được chạm trước đó và hàm tạo tĩnh sẽ chạy quá sớm. –
@JoeKoberg, đó là một điểm tốt. Bạn có ít quyền kiểm soát hơn khi một hàm dựng tĩnh được gọi ra ngoài một cuộc gọi phương thức rõ ràng, tất nhiên. Tuy nhiên, tôi vẫn không thấy sự cần thiết của 'Init()'. Và 'Application_Start' và' Application_End' vẫn phải là sự kiện thích hợp. –