2012-01-27 16 views
5

Ho diverse classi decorate WebActivator.PreApplicationStartMethod.Definire un ordine di inizializzazione delle classi WebActivator.PreApplicationStartMethod

Uno è per Ninject, un'altra classe per AwesomeMVC e una terza per l'utilità di pianificazione in background.

Il problema è che la classe dello scheduler deve sfruttare le dipendenze, che vengono risolte dal contenitore IoC.

Le mie domande sono:

  1. posso avere diverse classi WebActivator.PreApplicationStartMethod?
  2. Posso definire l'ordine, in cui sono inizializzati, in modo che IoC, essendo il più importante, venga prima?
  3. Can WebActivator.PreApplicationStartMethod Le istanze di classe statica si basano sul contenitore IoC per risolvere le dipendenze definite dal costruttore?

risposta

1

Se si sa che il metodo PreAppStart A ha bisogno di correre dopo che il metodo PreAppStart B, quindi l'unico modo per achive che è quello di aggiungere esplicitamente una chiamata a B all'interno del corpo di A.

Per questo la strategia di funziona correttamente dovresti anche assicurarti che le implementazioni del metodo PreAppStart siano indifferenti, ovvero che possano essere tranquillamente chiamate più volte. Di solito questo può essere ottenuto tenendo traccia di se il metodo è già stato chiamato in una variabile booleana statica e non sta facendo nulla se quel valore è vero.

+0

Stai dicendo che anche se ho un metodo PreAppStat, può essere chiamato più volte? Perché è così? –

+1

Il framework chiamerà il metodo solo una volta. Ma diciamo che hai 3 componenti: A, B e C. A e B dipendono entrambi da C (e quindi, come da questa linea guida, entrambi chiamano il metodo PreAppStart di C nei loro metodi). Ma A e B sono indipendenti e non si conoscono l'un l'altro e quindi non possono coordinare quante volte è stato chiamato il metodo PreAppStart di C. Ecco perché il metodo di C deve essere idempotente. – marcind

+0

Oh, ho capito. Grazie. –

12

Sì, è possibile disporre di tutte le classi che si desidera abbiano un attributo di assieme WebActivator.PreApplicationStartMethod che le indichi. Molti pacchetti NuGet utilizzano questa tecnica per consentire loro di eseguire il bootstrap nell'applicazione senza modificare Global.asax.

È possibile anche definire l'ordine. È possibile passare un parametro denominato, Order nella chiamata PreApplicationStartMethod. Il framework WebActivator garantirà che i metodi vengano richiamati nell'ordine specificato. Ad esempio, per rendere il vostro registro quadro IoC prima, fare qualcosa di simile:

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

perché WebActivator classi sono classi statiche, non vedo come sia possibile utilizzare l'iniezione del costruttore in loro. È possibile can tuttavia utilizzare il localizzatore di servizio (anti?) - pattern registrando il proprio resolver IoC come localizzatore di servizio predefinito di Mvc, utilizzando System.Web.Mvc.DependencyResolver.SetResolver(IDependencyResolver resolver).

In questo caso non voglio addentrarmi in particolare sui vantaggi e gli svantaggi del modello di localizzazione del servizio!

+1

Vale la pena menzionare che è necessario utilizzare un pacchetto WebActivatorEx anziché WebActivator. – Vitaly

Problemi correlati