2012-01-27 14 views
5

Tôi có một số lớp WebActivator.PreApplicationStartMethod được trang trí.Xác định thứ tự khởi tạo của lớp WebActivator.PreApplicationStartMethod

Một là dành cho Ninject, một lớp khác dành cho AwesomeMVC và thứ ba là dành cho trình lên lịch công việc nền.

Vấn đề là lớp trình lên lịch cần tận dụng lợi thế của các gói phụ thuộc, được giải quyết bởi vùng chứa IoC.

Câu hỏi của tôi là:

  1. Tôi có thể có một vài lớp WebActivator.PreApplicationStartMethod?
  2. Tôi có thể xác định thứ tự, trong đó chúng được khởi tạo, để IoC, là quan trọng nhất, đến trước?
  3. Có thể WebActivator.PreApplicationStartMethod các cá thể lớp tĩnh dựa vào thùng chứa IoC để giải quyết các phụ thuộc được định nghĩa bởi hàm tạo của chúng?

Trả lời

1

Nếu bạn biết rằng phương pháp PreAppStart A cần để chạy sau khi PreAppStart phương pháp B, sau đó là cách duy nhất để đạt được điều đó là rõ ràng thêm một cuộc gọi đến B bên trong cơ thể của A.

Đối với chiến lược đó cho làm việc một cách chính xác, bạn cũng nên chắc chắn rằng việc triển khai phương pháp PreAppStart của bạn là indempotent tức là chúng có thể được gọi một cách an toàn nhiều lần. Thông thường, điều này có thể đạt được bằng cách theo dõi xem phương thức đã được gọi trong biến boolean tĩnh và không làm bất cứ điều gì nếu biến đó là đúng.

+0

Bạn có nói rằng ngay cả khi tôi có một phương pháp PreAppStat, nó có thể được gọi nhiều lần? Tại sao nó như vậy? –

+1

Khung sẽ chỉ gọi phương thức một lần. Nhưng nói rằng bạn có 3 thành phần: A, B, và C. A và B đều phụ thuộc vào C (và do đó theo hướng dẫn này, cả hai đều gọi phương thức PreAppStart của C theo phương thức riêng của chúng). Nhưng A và B là độc lập và không biết về nhau và do đó không thể phối hợp bao nhiêu lần phương thức PreAppStart của C được gọi. Đó là lý do tại sao phương pháp của C cần phải là idempotent. – marcind

+0

Ồ, tôi hiểu rồi. Cảm ơn bạn. –

12

Có, bạn có thể có nhiều lớp như bạn muốn có thuộc tính assembly WebActivator.PreApplicationStartMethod trỏ đến chúng. Nhiều gói NuGet sử dụng kỹ thuật này để cho phép chúng khởi động vào ứng dụng của bạn mà không cần chỉnh sửa Global.asax.

Bạn cũng có thể xác định đơn đặt hàng. Bạn có thể chuyển thông số được đặt tên, Order trong cuộc gọi PreApplicationStartMethod. Khung công tác WebActivator sẽ đảm bảo rằng các phương thức được gọi theo thứ tự được chỉ định. Ví dụ, để làm cho khung đăng ký IoC của bạn đầu tiên, làm một cái gì đó như thế này:

[assembly: WebActivator.PreApplicationStartMethod(typeof(MyApp.App_Start.NinjectWebCommon), "Start", Order=1] 
[assembly: WebActivator.PreApplicationStartMethod(typeof(MyApp.App_Start.BGScheduler), "Start", Order=2] 

WebActivator lớp là các lớp tĩnh, tôi không thấy làm thế nào bạn có thể sử dụng constructor injection trong đó. Tuy nhiên, bạn có thể, sử dụng trình định vị dịch vụ (anti?) - mẫu bằng cách đăng ký trình phân giải IoC của bạn làm trình định vị dịch vụ mặc định của Mvc, sử dụng System.Web.Mvc.DependencyResolver.SetResolver(IDependencyResolver resolver).

Tôi đặc biệt không muốn đi vào các lợi ích và hạn chế của mẫu định vị dịch vụ tại đây mặc dù!

+1

Chỉ đáng lưu ý rằng cần phải sử dụng gói WebActivatorEx thay vì WebActivator. – Vitaly