2012-01-27 13 views
5

Mam kilka klas dekorowanych WebActivator.PreApplicationStartMethod.Definiowanie kolejności inicjowania klas WebActivator.PreApplicationStartMethod

Jedna dotyczy Ninject, innej klasy dla AwesomeMVC, a trzecia służy do planowania zadań w tle.

Problem polega na tym, że klasa planisty musi skorzystać z zależności, które są rozwiązywane przez kontener IoC.

Moje pytania są następujące:

  1. Czy mogę mieć kilka klas WebActivator.PreApplicationStartMethod?
  2. Czy mogę zdefiniować kolejność, w której są inicjowane, aby IoC, jako najważniejsza, była najważniejsza?
  3. Czy instancje klasy statycznej programu WebActivator.PreApplicationStartMethod mogą polegać na kontenerze IoC w celu rozwiązania zależności zdefiniowanych przez konstruktora?

Odpowiedz

1

Jeśli wiesz, że metoda PreAppStart musi uruchomić po metody PreAppStart B, to jedyny sposób, aby achive to wyraźnie dodać wywołanie do B wewnątrz korpusu A.

Na tej strategii do działa poprawnie, należy również upewnić się, że implementacje metod PreAppStart są niepoprawne, tzn. można je bezpiecznie wywołać wiele razy. Zwykle można to osiągnąć, śledząc, czy metoda została już wywołana w statycznej zmiennej boolowskiej i nie robi niczego, jeśli ta dolina jest prawdziwa.

+0

Mówisz, że nawet jeśli mam jedną metodę PreAppStat, może ona zostać wywołana kilka razy? Dlaczego tak jest? –

+1

Framework wywoła metodę tylko raz. Ale powiedzmy, że masz 3 komponenty: A, B i C. A i B zależą od C (i dlatego zgodnie z tą wytyczną oboje nazywają metodę PreAppStart C własnymi metodami). Ale A i B są niezależne i nie wiedzą o sobie nawzajem, a więc nie mogą koordynować, ile razy została wywołana metoda C PreAppStart. Dlatego metoda C musi być idempotentna. – marcind

+0

Och, rozumiem. Dziękuję Ci. –

12

Tak, możesz mieć tyle klas, ile chcesz, które mają przypisany atrybut składania WebActivator.PreApplicationStartMethod. Wiele pakietów NuGet korzysta z tej techniki, aby umożliwić im ładowanie do aplikacji bez edytowania Global.asax.

Możesz również zdefiniować kolejność. Możesz przekazać nazwany parametr, Order w rozmowie PreApplicationStartMethod. Ramy WebActivator zapewnią, że metody będą wywoływane w określonej kolejności. Na przykład, aby dokonać ramową rejestr IoC najpierw zrobić coś takiego:

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

ponieważ WebActivator zajęcia są ćwiczenia statyczne, nie widzę w jaki sposób można użyć konstruktora wtrysku w nich. Możesz jednak użyć atrybutu lokalizatora usług (anty?) Rejestrując przelicznik IoC jako domyślny lokalizator usługi Mvc, używając System.Web.Mvc.DependencyResolver.SetResolver(IDependencyResolver resolver).

Nie chcę jednak w tym miejscu przejrzeć zalet i zalet modelu lokalizatora usług!

+1

Warto wspomnieć, że zamiast WebActivator należy użyć pakietu WebActivatorEx. – Vitaly

Powiązane problemy