2012-01-27 4 views
5

여러 개의 WebActivator.PreApplicationStartMethod 데코 레이팅 클래스가 있습니다.WebActivator.PreApplicationStartMethod 클래스의 초기화 순서 정의

하나는 Ninject 용이고 다른 하나는 AwesomeMVC 용이고 다른 하나는 백그라운드 작업 스케줄러 용입니다.

문제는 스케줄러 클래스가 IoC 컨테이너에서 해결되는 종속성을 활용해야한다는 것입니다.

내 질문은 :

  1. 내가 여러 WebActivator.PreApplicationStartMethod 클래스를 가질 수 있습니까?
  2. 가장 중요한 IoC가 먼저 오도록 순서를 정의 할 수 있습니까?
  3. WebActivator.PreApplicationStartMethod 정적 클래스 인스턴스는 생성자 정의 종속성을 해결하기 위해 IoC 컨테이너에 의존 할 수 있습니까?

답변

1

당신이 PreAppStart 방법 A가 PreAppStart 방법 B 후 실행할 필요가 있음을 알고 있다면, 그 유일한 방법은 그에게 그 전략 A.

의 몸 안에 B로 명시 적으로 호출을 추가하는 것입니다 실현하려 올바르게 작동하려면 PreAppStart 메소드 구현이 유효하지 않아야합니다. 즉, 안전하게 여러 번 호출 할 수 있습니다. 대개이 메소드는 메소드가 정적 부울 변수에서 이미 호출되었는지 여부를 추적하고 해당 val이 true 인 경우 아무 것도 수행하지 않음으로써 수행 할 수 있습니다.

+0

하나의 PreAppStat 메서드가 있어도 여러 번 호출 될 수 있다는 말입니까? 왜 그래야만하지? –

+1

프레임 워크는 메서드를 한 번만 호출합니다. 그러나 A, B 및 C의 세 가지 구성 요소가 있다고 가정 해보십시오. A와 B는 둘 다 C에 종속되어 있으므로이 가이드 라인에 따라 둘 다 자체 메서드에서 C의 PreAppStart 메서드를 호출합니다. 그러나 A와 B는 독립적이며 서로에 대해 알지 못하므로 C의 PreAppStart 메소드가 호출 된 횟수를 조정할 수 없습니다. 그래서 C의 방법은 멱등수가되어야합니다. – marcind

+0

오, 알겠습니다. 고맙습니다. –

12

예, 원하는 수만큼 클래스를 지정하고 WebActivator.PreApplicationStartMethod 어셈블리 특성을 가리킬 수 있습니다. 많은 NuGet 패키지는이 기술을 사용하여 Global.asax를 편집하지 않고 응용 프로그램으로 부트 스트랩 할 수있게합니다.

주문을 정의 할 수도 있습니다. PreApplicationStartMethod 호출에 명명 된 매개 변수 Order을 전달할 수 있습니다. WebActivator 프레임 워크는 메소드가 지정된 순서대로 호출되도록합니다. 예를 들어, 다음과 같이 수행 먼저 IOC의 프레임 워크 레지스터를 만들기 위해 :

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

WebActivator 때문에 클래스는 정적 클래스입니다을, 나는 당신이 그 (것)들에서 생성자 주입을 사용하는 방법을 볼 수 없습니다. 그러나 System.Web.Mvc.DependencyResolver.SetResolver(IDependencyResolver resolver)을 사용하여 IoC 해결자를 Mvc의 기본 서비스 로케이터로 등록하여 서비스 로케이터 (anti?) 패턴을 사용할 수 있습니다.

여기 서비스 로케이터 패턴의 장점과 단점에 대해 특별히 언급하고 싶지는 않습니다.

+1

WebActivator 대신 WebActivatorEx 패키지를 사용해야한다는 점을 언급 할 가치가 있습니다. – Vitaly