2014-11-26 8 views
6

Ich habe begonnen, die Interna von asp.net mvc (6/vnext) zu testen und ich habe eine Menge Fragen, aber ich würde gerne hier bleiben. Ich benutze Visual Studio 2015 Vorschau und ich sah eine neue Funktion in asp.net mvc 6 (oder vNext), die Controller nicht von Controller Basisklasse erben müssen. Ich sah in der asp.net Mvc 4/5 der Controller-Klasse (oder seine Abstraktionen) hat die Eigenschaften für Ressourcen wie TempData, ViewData, ViewBag und Verfahren wie View(), Json(), File() usw.Wie weiß asp.net mvc 6, welche Ressourcen hinzugefügt werden müssen, wenn ein Controller nicht von der Controller-Klasse erbt?

nun in der neuen Version müssen wir nicht von der Basisklasse Controller erben. Also, meine Frage ist, Wie weiß asp.net mvc welche Ressourcen hinzuzufügen, wenn ein Controller nicht von Controller Klasse erbt? Ich sah, wir können eine Eigenschaft hinzufügen und es wird zur Laufzeit gelöst werden, aber wie ist es im asp.net Kern getan? Gibt es einen IoC, der innerhalb des asp.net-Kerns arbeitet, um es zu lösen?

Antwort

5

MVC 6 findet Controller, die auf einem öffentlichen Typ basieren und mit dem Suffix Controller enden. Die Realität ist ein bisschen komplizierter als das, und es ist auch anpassbar, um andere Konventionen zu unterstützen, aber das ist die Essenz davon.

Darüber hinaus verfügt MVC 6 über ein System zum "Hydratisieren" eines Controllers (und Ansichten und anderer spezifischer Typen) mit den erforderlichen Daten. Dies geschieht meist mit dem Attribut [Activate], das MVC anweist, in das Dependency-Injection-System aufzurufen, um Abhängigkeiten für eine Instanz einer Klasse aufzufüllen. Sie können auch im eingebauten in Controller Basisklasse sehen, wie dies geschehen ist:

https://github.com/aspnet/Mvc/blob/2353bd911ac137e7858de5bef88af8f7eccaa49f/src/Microsoft.AspNet.Mvc.Core/Controller.cs#L92L99

namespace Microsoft.AspNet.Mvc 
{ 
    public class Controller : ... 
    { 
     ... 

     [Activate] 
     public ActionContext ActionContext { get; set; } 

     [Activate] 
     public IUrlHelper Url { get; set; } 

     [Activate] 
     public IActionBindingContextProvider BindingContextProvider { get; set; } 

     ... 
    } 
} 

von DefaultControllerFactory Dies wird ausgelöst hier:

https://github.com/aspnet/Mvc/blob/2eef4dd3cf2964136dea9a144b1ee8c21df25c23/src/Microsoft.AspNet.Mvc.Core/DefaultControllerFactory.cs#L41

_controllerActivator.Activate(controller, actionContext); 

Und das verwendet eine IControllerActivator, und insbesondere die DefaultControllerActivator, die für diescannt undAttribut weist Werte zu den Eigenschaften:

https://github.com/aspnet/Mvc/blob/c16214a53db7f16b06fd9b5a59fa1541e8ecd87a/src/Microsoft.AspNet.Mvc.Core/DefaultControllerActivator.cs

+0

Wissen Sie, welcher Teil von Controller kann ich sehen, wo es durch den Kern gelöst ist? –

+0

Danke Eilon! –