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.asax
Application_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));
}
}
}
Lo capisco, ma sono curioso del motivo per cui StructureMap preferisce utilizzare "WebActivator.PreApplicationStartMethodAttribute" su ASP.NET 4 fornito "System.Web.PreApplicationStartMethodAttribute". – Kev
@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. –
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