2012-06-28 14 views
17

Jestem nowy w prostym pojemniku IOC wtryskiwacza. Rozpocznę pracę nad projektem, który będzie wymagał wdrożenia MVC na wielu najemców w ASP.NET przy użyciu API ASP.NET Web API MVC 4.Czy Simple Injector obsługuje MVC 4 ASP.NET Web API?

Moje pytanie brzmi: Czy prosty wtryskiwacz obsługuje MVC 4 ASP.NET Web API? Odczytywanie prostej dokumentacji wtryskiwaczy, takiej jak this, powoduje odwołanie do MVC 3 i chciałbym się dowiedzieć, czy MVC 4 jest również obsługiwany.

+0

Simple Injector 2.5 zawiera [pakiet integracji Web API] (https://simpleinjector.codeplex.com/wikipage?title=Web%20API%20Integration). – Steven

Odpowiedz

24

Czy prosty wtryskiwacz IOC obsługuje MVC 4 ASP.NET Web API?

Obecnie nie obsługuje interfejsu MVC4 Web API, ale wsparcie zostanie dodane w przyszłości. The integration guide zostanie zaktualizowany, gdy to się stanie.


UPDATE: Web API support dodano Simple wtryskiwacza 2.5.


W międzyczasie, można stworzyć swój własny System.Web.Http.Dependencies.IDependencyResolver realizacji tego prostego wtryskiwacza. Poniżej jest wdrożenie do pracy z Web API w IIS gospodarzem środowiska:

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

Ta implementacja implementuje żadnej scopingu, ponieważ trzeba korzystać z życia Per Web Api Request za wdrażanie scopingu wewnątrz internetowej gospodarzem środowiska (gdy wniosek może skończyć w innym wątku niż tam, gdzie się zaczęło).

Because of the way Web API is designed, bardzo ważne jest, aby jawnie zarejestrować wszystkie kontrolery Web API. Można to zrobić za pomocą następującego kodu:

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

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

można zarejestrować SimpleInjectorHttpDependencyResolver następująco:

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

Dziękuję za odpowiedź. – user1489941

+0

Mam jeszcze jedno pytanie: Czy można uniknąć refleksji za pomocą prostego wtryskiwacza? – user1489941

+0

Korekta kodu w cue: "GetAllInstance" poprawiona na "GetAllInstances". Na szczęście, SO wymaga 6+ znaków do edycji, ale ktoś powinien powiedzieć im, że * dla kodu *, komputery są bezlitosne, takie literówki powinny zostać złapane i poprawione. –

3

Krótka odpowiedź brzmi: tak, to działa. Poniżej znajduje się fragment kodu, który działa dla mojego projektu z obu API Web i MVC4 kontrolerów (częściowo w oparciu o odpowiedzi Steven powyżej):

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

Aby uzyskać dostęp do swoich typów w kontrolerach API można użyć następującego fragmentu kodu:

DependencyResolver.Current.GetService<InterfaceName>()