2012-01-24 24 views
7

Ho notato che quando ho installato StructureMap da NuGet nel mio progetto ASP.NET MVC3, anche il pacchetto WebActivator di Dave Ebbo è stato aggiunto come dipendenza.Quale PreApplicationStartMethod dovrei usare?

WebActivator fornisce un attributo PreApplicationStartMethod e, nel codice boilerplate aggiunto al momento dell'installazione, viene utilizzato per inizializzare il contenitore CIO e la dipendenza risolutore in essa la propria classe, invece di fare questo all'interno di metodo di 's Global.asaxApplication_Start.

Dato che ASP.NET 4 ha già un proprio System.Web.PreApplicationStartMethodAttribute Perché è stato necessario per WebActivator per fornitura la propria versione e per StructureMap da usare che?

Suppongo che non lo sia utilizzare la variante di WebActivator?

codice Aggiunto per Darin:

using System.Web; 
using System.Web.Mvc; 
using StructureMap; 

[assembly: WebActivator.PreApplicationStartMethod(
        typeof(MyMvcApp.App_Start.StructuremapMvc), "Start")] 
// or 

[assembly: PreApplicationStartMethod(
        typeof(MyMvcApp.App_Start.StructuremapMvc), "Start")] 

namespace MyMvcApp.App_Start { 
    public static class StructuremapMvc { 
    public static void Start() { 
     var container = (IContainer) IoC.Initialize(); 
     DependencyResolver.SetResolver(new SmDependencyResolver(container)); 
    } 
    } 
} 

risposta

5

pacchetti Nuget per i contenitori di a ASP.NET MVC 3 solito preferiscono utilizzare WebActivator per evitare confusione con qualsiasi codice esistente che si potrebbe avere in Application_Start. Ninject usa esattamente lo stesso approccio.

è possibile avere più attributi WebActivator.PreApplicationStartMethod nell'applicazione e prima per .NET 4.5 un singolo System.Web.PreApplicationStartMethodAttribute.

+0

Lo capisco, ma sono curioso del motivo per cui StructureMap preferisce utilizzare "WebActivator.PreApplicationStartMethodAttribute" su ASP.NET 4 fornito "System.Web.PreApplicationStartMethodAttribute". – Kev

+1

@Kev, è perché puoi avere un singolo 'System.Web.PreApplicationStartMethodAttribute' per applicazione e se StructureMap lo avesse usato, non saresti più in grado di fornire le tue inizializzazioni personalizzate. Il 'WebActivator.PreApplicationStartMethod' è più elaborato rispetto all'attributo ASP.NET 4.0 incorporato. Si basa su di esso ma utilizza la reflection per recuperare tutti i 'WebActivator.PreApplicationStartMethod' che sono registrati ed eseguirli tutti. Ecco perché i pacchetti NuGet utilizzano questo approccio. Per evitare di dirottarti il ​​metodo integrato. –

+0

Sì, ma mi perdoni se mi sembra un po 'debole, StructureMap in realtà non lo usa * come nel riservarlo, quindi non è possibile aggiungere altro codice di inizializzazione. Vedi il codice che ho aggiunto alla mia domanda. Potrei aggiungere ancora un altro codice di inizializzazione a 'Start()' che funziona con altri non StructureMap. – Kev