6

Tôi đã gặp phải một vấn đề khá lông. Có lẽ là một giải pháp đơn giản cho điều này nhưng tôi không thể tìm thấy nó!Construtor/Setter Injection sử dụng IoC trong HttpHandler, có thể không?

Tôi có một HttpHandler tùy chỉnh mà tôi muốn xử lý một yêu cầu, đăng nhập một số thông tin sau đó nhập các chi tiết trong cơ sở dữ liệu. Tôi đang sử dụng NUnit và Castle Windsor.

Vì vậy, tôi có hai giao diện; một cho đăng nhập khác để nhập dữ liệu, được xây dựng tiêm. Tôi nhanh chóng phát hiện ra rằng không có cách nào để gọi constructor như là constructor mặc định parameterless luôn được gọi thay thế.

Vì vậy, tôi nghĩ tôi sẽ sử dụng Setter injection và để Castle windsor phân loại nó ra. Điều này thực sự hoạt động như khi tôi sử dụng container.Resolve<CustomHttpHandler>(); Tôi có thể kiểm tra xem bộ ghi không phải là không. (Trong Application_Start trong Global.asax.cs)

Vấn đề là mặc dù Castle Windsor có thể tạo ra cá thể ứng dụng http không sử dụng nó ??? Tôi nghĩ??

Về cơ bản, toàn bộ lý do để thực hiện theo cách này là để có thể kiểm tra trình ghi nhật ký và mã lưu trữ dữ liệu trong sự cô lập thông qua việc thử và thử nghiệm đơn vị.

Bất kỳ ý tưởng nào tôi có thể giải quyết vấn đề này?

Cảm ơn!

+0

Matt, thật không hay khi thay đổi câu hỏi của bạn như vậy bởi vì bạn đã vô hiệu hóa tất cả các câu trả lời hiện có và bạn buộc mọi người phải cập nhật. Vui lòng hoàn nguyên chỉnh sửa của bạn và tạo câu hỏi mới thay thế. –

+0

Hi Mauricio. Xin lỗi, rõ ràng tôi mới làm thế nào điều này hoạt động. Đã hoàn nguyên và tạo câu hỏi mới. Cảm ơn! – Matt

Trả lời

2

Không thể, ít nhất là không trực tiếp. Các đối tượng IHttpHandler được khởi tạo bởi thời gian chạy ASP.NET và nó không cho phép Windsor tham gia vào việc tạo ra nó. Bạn có thể:

  • Kéo phụ thuộc, bằng cách sử dụng vùng chứa làm định vị dịch vụ.
  • Thiết lập một handler cơ sở đó tạo ra, tiêm và các đại biểu để xử lý riêng (xem cách Spring does it)
  • Sử dụng container như định vị dịch vụ cho một dịch vụ để xử lý toàn bộ yêu cầu (như saret explained)
+0

Dang, tôi có cảm giác nó có thể là trường hợp. Bạn có thể giải thích một chút điểm đầu tiên của bạn: Kéo phụ thuộc, bằng cách sử dụng container như một định vị dịch vụ. Cảm ơn! – Matt

+0

@Matt: từ HttpHandler của bạn, hãy gọi vùng chứa để tìm nạp bất kỳ phụ thuộc nào bạn cần. –

+0

Cảm ơn bạn đã trả lời Mauricio. Hiểu! – Matt

2

Điều bạn có thể làm là yêu cầu HttpHandler gọi đến một đối tượng khác thực sự xử lý yêu cầu. vì vậy trong phương thức ProcessRequest của HttpHandler bạn sẽ làm một cái gì đó như thế này:

public void ProcessRequest(HttpContext context) 
{ 
var myHandlerObject = container.Resolve<HandlerObject>(); 
myHandlerObject.ProcessRequest(context or some state/info that is required) 
} 
+0

Xin chào. Cảm ơn ý tưởng. Nó có thể là giải pháp, một trong những lựa chọn khác Mauricio. Cảm ơn! – Matt