2012-06-28 28 views
17

Sono nuovo al contenitore IOC Injector semplice. Inizierò a lavorare in un progetto che richiederà un'implementazione MVN ASP.NET multi-tenant utilizzando l'API Web ASP.NET di MVC 4.Simple Injector supporta MVC 4 ASP.NET Web API?

La mia domanda è: Simple injector supporta MVC 4 ASP.NET Web API? Leggendo la documentazione dell'iniettore semplice come this si fa riferimento a MVC 3 e vorrei sapere se anche MVC 4 è supportato.

+0

semplice Injector 2.5 contiene un [pacchetto Web API di integrazione] (https://simpleinjector.codeplex.com/wikipage?title=Web%20API%20Integration). – Steven

risposta

24

Il supporto IOC Inject semplice supporta MVC 4 ASP.NET Web API?

Attualmente non ha supporto per MVC4 Web API, ma il supporto verrà aggiunto in futuro. The integration guide verrà aggiornato quando ciò accade.


UPDATE: Web API support è stato aggiunto alla semplice Injector 2.5.


Nel frattempo, è possibile creare il proprio System.Web.Http.Dependencies.IDependencyResolver implementazione per l'iniettore semplice. Qui di seguito è l'implementazione per l'utilizzo di API Web in un ambiente ospitato IIS:

public class SimpleInjectorHttpDependencyResolver : 
    System.Web.Http.Dependencies.IDependencyResolver 
{ 
    private readonly Container container; 

    public SimpleInjectorHttpDependencyResolver(
     Container container) 
    { 
     this.container = container; 
    } 

    public System.Web.Http.Dependencies.IDependencyScope 
     BeginScope() 
    { 
     return this; 
    } 

    public object GetService(Type serviceType) 
    { 
     IServiceProvider provider = this.container; 
     return provider.GetService(serviceType); 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     IServiceProvider provider = this.container; 
     Type collectionType = typeof(IEnumerable<>).MakeGenericType(serviceType); 
     var services =(IEnumerable<object>)this.ServiceProvider.GetService(collectionType); 
     return services ?? Enumerable.Empty<object>(); 
    } 

    public void Dispose() 
    { 
    } 
} 

Questa implementazione implementa senza scoping, dal momento che è necessario utilizzare la durata Per Web Api Request per l'attuazione di scoping all'interno di un ambiente web hosting (dove a richiesta può finire su un thread diverso da quello in cui è stato avviato).

Because of the way Web API is designed, è molto importante registrare esplicitamente tutti i controller API Web. È possibile farlo utilizzando il seguente codice:

var services = GlobalConfiguration.Configuration.Services; 
var controllerTypes = services.GetHttpControllerTypeResolver() 
    .GetControllerTypes(services.GetAssembliesResolver()); 

foreach (var controllerType in controllerTypes) 
{ 
    container.Register(controllerType); 
} 

È possibile registrare il SimpleInjectorHttpDependencyResolver come segue:

// NOTE: Do this as last step, after registering the controllers. 
GlobalConfiguration.Configuration.DependencyResolver = 
    new SimpleInjectorHttpDependencyResolver(container); 
+0

Grazie per la risposta. – user1489941

+0

Un'altra domanda che ho è: si può evitare la riflessione usando un semplice iniettore? – user1489941

+0

Correzione del codice in cue: "GetAllInstance" corretto su "GetAllInstances". Unforunately, SO richiede più di 6 caratteri per fare una modifica, ma qualcuno dovrebbe dire loro che * per il codice *, i computer sono spietati, tali refusi dovrebbero essere scoperti e corretti. –

3

La risposta breve è: Sì, funziona. Qui di seguito è il frammento di codice che funziona per il mio progetto con i controllori sia Web API e MVC4 (parzialmente basata sulla risposta di Steven sopra):

var container = new Container(); 

//Register you types in container here 

container.RegisterMvcControllers(Assembly.GetExecutingAssembly()); 
container.RegisterMvcAttributeFilterProvider(); 

var controllerTypes = 
from type in Assembly.GetExecutingAssembly().GetExportedTypes() 
where typeof(ApiController).IsAssignableFrom(type) 
where !type.IsAbstract 
where !type.IsGenericTypeDefinition 
where type.Name.EndsWith("Controller", StringComparison.Ordinal) 
select type; 

foreach (var controllerType in controllerTypes) 
{ 
    container.Register(controllerType); 
} 

container.Verify(); 
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container)); 

Per accedere ai tipi nei controllori API è possibile utilizzare il seguente frammento di codice:

DependencyResolver.Current.GetService<InterfaceName>() 
Problemi correlati