2012-02-29 8 views
7

W ASP.net MVC4 istnieje "nowa" koncepcja web API do ujawniania funkcjonalności CRUD w twoim modelu danych. Podstawową klasą dla tych kontrolerów jest DataController, która pochodzi z ApiController.Dlaczego kontrolery web ASPI Asp.net nie pochodzą z IController'a

Niestety ten ApiController nie pochodzi z IController, co jest problematyczne, ponieważ te żądania nie mogą być obsługiwane przez twoją normalną fabrykę kontrolerów niestandardowych, ponieważ mają one zwrócić instancję IController.

Czy ktoś wie, dlaczego tak się dzieje, ponieważ nie widzę powodu, dla którego miałbyś mieć kontroler w swoim projekcie MVC, który nie pochodzi z IController, ponieważ to łamie fabrykę kontrolerów niestandardowych, ponieważ nie jest w stanie utworzyć instancji każdego kontrolera w twoim projekcie.

W skrócie, z powodu tego spadku nie można użyć kontenera DI do wstrzykiwania zależności.

Odpowiedz

7

Wysłałem to samo pytanie również do firmy Microsoft i otrzymałem następującą odpowiedź od Eilona Liptona (za to):

Krótko mówiąc, podczas gdy ASP.NET MVC i ASP.NET Web API dzielą wiele takich samych koncepcji projektowych (wtrysk zależności, wiele interfejsów do podłączenia niestandardowych implementacji i łatwość testowania), bazują na różnych podstawowe stosy HTTP. MVC opiera się na stosie System.Web, który był używany w ASP.NET od ponad 10 lat. Web API opiera się na nowym stosie System.Net.Http, który oferuje większą elastyczność w zakresie hostingu (hosty niestandardowe IIS + hosty testów jednostkowych), a także lepszą testowalność i rozszerzalność. Jeśli porównasz IController i IHttpController, zobaczysz, że używasz System.Web w górę iw dół stosu, a drugi nie używa go w ogóle.

Bez względu na to, wszystkie technologie utworzone na stosie ASP.NET - MVC, formularze internetowe, Web API, strony internetowe (i Razor) - będą nadal działać równolegle w ramach aplikacji, umożliwiając aby wybrać odpowiednie elementy do budowy każdej części aplikacji. Podczas gdy poszczególne implementacje komponentów w każdym elemencie nie są wymienne, można je połączyć z tymi samymi usługami, takimi jak systemy wtryskiwania zależności, narzędzia rejestrowania, dostawcy danych i tak dalej.

Kiedy opublikujemy nasz post na ten temat, uważam, że powinno to jeszcze bardziej wyjaśnić.

1

Aby wykonać DI z ASP.Net WebAPI, należy wykonać przelicznik zależności dla swojego kontenera DI.

następujące prace dla Ninject

public class NinjectDependencyResolver : System.Web.Http.Services.IDependencyResolver 
{ 
    private static IKernel m_Kernel; 

    public NinjectDependencyResolver() 
    { 
     m_Kernel = new StandardKernel(); 
    } 

    public NinjectDependencyResolver(IKernel myKernel) 
    { 
     m_Kernel = myKernel; 
    } 

    public object GetService(Type serviceType) 
    { 
     return m_Kernel.TryGet(serviceType); 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     return m_Kernel.GetAll(serviceType); 
    } 
} 

następnie powiązać go w pliku Global.ascx używając:

GlobalConfiguration.Configuration.ServiceResolver.SetResolver(new NinjectDependencyResolver(yourKernel)); 

ten jest podobny (ale nie całkiem identyczne) do wstrzykiwania zależności MVC3

+1

Użyłem wcześniej własnej fabryki kontrolerów, ta klasa nadal jest wywoływana nawet dla kontrolerów webapi. Nie mogę pobrać aplikacji, aby zadzwonić do DependencyResolver. Wszystkie żądania przechodzą przez mój własny ControllerFactory (usunięcie tej niestandardowej fabryki tego nie zmienia). – thekip

Powiązane problemy