2012-06-28 7 views
17

Ich bin neu in Simple Injector IOC Container. Ich werde anfangen, in einem Projekt zu arbeiten, das eine Multi-Tenant ASP.NET MVC-Implementierung mit MVC 4 ASP.NET Web API erfordert.Unterstützt Simple Injector MVC 4 ASP.NET Web API?

Meine Frage ist: Unterstützt Simple Injektor MVC 4 ASP.NET Web API? Das Lesen einer einfachen Injektor-Dokumentation wie this macht Verweise auf MVC 3 und ich würde gerne wissen, ob MVC 4 auch unterstützt wird.

+0

Simple Injector 2.5 enthält ein [Web-API-Integrationspaket] (https://simpleininjektor.codeplex.com/wikipage?title=Web%20API%20Integration). – Steven

Antwort

24

Unterstützt einfache Injektor IOC MVC 4 ASP.NET Web API?

Es hat derzeit keine Unterstützung für MVC4 Web API, aber Unterstützung wird in der Zukunft hinzugefügt werden. The integration guide wird aktualisiert, wenn dies passiert.


UPDATE: Web API support hat Simple Injector 2.5 hinzugefügt.


In der Zwischenzeit können Sie Ihre eigene System.Web.Http.Dependencies.IDependencyResolver Implementierung für die einfache Injector erstellen. Unten ist die Implementierung mit Web-API in einer IIS-gehosteten Umgebung für die Arbeit:

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() 
    { 
    } 
} 

Diese Implementierung implementiert kein Scoping, da Sie für die Implementierung Scoping in einer Web-Hosting-Umgebung die Per Web Api Request Lebensdauer verwenden müssen (wenn ein Antrag enden kann auf einem anderen Thread als wo es angefangen hat).

Because of the way Web API is designed, es ist sehr wichtig, alle Web-API-Controller explizit zu registrieren. Sie können dies mit dem folgenden Code:

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

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

Sie können die SimpleInjectorHttpDependencyResolver registrieren Sie wie folgt vor:

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

Vielen Dank für Ihre Antwort. – user1489941

+0

Eine andere Frage, die ich habe, ist: Kann Reflektion mit einem einfachen Injektor vermieden werden? – user1489941

+0

Code-Korrektur in Cue: 'GetAllInstance' korrigiert zu 'GetAllInstances'. Unglücklicherweise benötigt SO 6+ Zeichen, um eine Bearbeitung vorzunehmen, aber jemand sollte ihnen sagen, dass * für Code *, Computer sind unversöhnlich, solche Tippfehler sollten aufgefangen und bearbeitet-korrigiert werden. –

3

Die kurze Antwort lautet: Ja, es funktioniert. Unten ist der Code-Snippet, das sowohl mit Web-API und MVC4 Controller (teilweise basierend auf Steven Antwort oben) für mein Projekt arbeitet:

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)); 

Für den Zugriff auf Ihre Arten in dem API-Controllern Sie den folgenden Codeausschnitt verwenden:

DependencyResolver.Current.GetService<InterfaceName>()