2012-01-27 10 views
5

Tengo varias clases decoradas de WebActivator.PreApplicationStartMethod.Defina un orden de inicialización de las clases WebActivator.PreApplicationStartMethod

Uno es para Ninject, otra clase para AwesomeMVC y el tercero es para el planificador de tareas en segundo plano.

El problema es que la clase del planificador necesita aprovechar las dependencias, que se resuelven con el contenedor IoC.

Mis preguntas son:

  1. ¿Puedo tener varias clases WebActivator.PreApplicationStartMethod?
  2. ¿Puedo definir el orden en el que se inicializan, de modo que la IoC, siendo la más importante, es lo primero?
  3. ¿Pueden las instancias de clase estática WebActivator.PreApplicationStartMethod confiar en el contenedor IoC para resolver sus dependencias definidas por el constructor?

Respuesta

1

Si sabe que el método PreAppStart A necesita para funcionar después de PreAppStart método B, entonces la única manera de achive es agregar explícitamente una llamada a B dentro del cuerpo de A.

Para que tal estrategia Para que funcione correctamente, también debe asegurarse de que las implementaciones de su método PreAppStart sean indefensas, es decir, puedan llamarse de manera segura varias veces. Por lo general, esto se puede lograr haciendo un seguimiento de si el método ya ha sido llamado en una variable booleana estática y no haciendo nada si ese valor es verdadero.

+0

¿Está diciendo que incluso si tengo un método PreAppStat, se puede llamar varias veces? ¿Por que es esto entonces? –

+1

El marco solo llamará al método una vez. Pero supongamos que tiene 3 componentes: A, B y C. Tanto A como B dependen de C (y, por lo tanto, según esta pauta, ambos llaman al método PreAppStart de C en sus propios métodos). Pero A y B son independientes y no se conocen entre sí, por lo que no pueden coordinar cuántas veces se llamó el método PreAppStart de C. Es por eso que el método de C necesita ser idempotente. – marcind

+0

Oh, lo entiendo. Gracias. –

12

Sí, puede tener tantas clases como desee que tengan un atributo de ensamblaje WebActivator.PreApplicationStartMethod apuntando a ellas. Muchos paquetes NuGet usan esta técnica para permitirles iniciarse en su aplicación sin editar Global.asax.

Puede definir el pedido también. Puede pasar un parámetro con nombre, Order en la llamada PreApplicationStartMethod. El marco de WebActivator se asegurará de que los métodos se invoquen en el orden especificado. Por ejemplo, para hacer su registro marco de la COI en primer lugar, hacer algo como esto:

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

Debido WebActivator clases son clases estáticas, no veo cómo se puede utilizar la inyección de constructor en ellos. Usted puede sin embargo, use el localizador de servicio (anti?) - patrón registrando su resolución de IoC como el localizador de servicio predeterminado de Mvc, usando System.Web.Mvc.DependencyResolver.SetResolver(IDependencyResolver resolver).

Sin embargo, no quiero entrar en los beneficios y desventajas del patrón de localizador de servicios.

+1

. Solo vale mencionar que un paquete WebActivatorEx necesita ser utilizado en lugar de WebActivator. – Vitaly

Cuestiones relacionadas