2014-11-26 17 views
6

Ho iniziato a studiare gli interni da asp.net mvc (6/vnext) e ho un sacco di domande, ma vorrei tenerne una qui. Sto usando l'anteprima di Visual Studio 2015 e ho visto una nuova funzionalità in asp.net mvc 6 (o vNext) che non è necessario che il controller erediti dalla classe base Controller. Ho visto in asp.net mvc 4/5 della classe Controller (o le sue astrazioni) ha le proprietà di risorse come TempData, ViewData, ViewBag e metodo come View(), Json(), File() eccIn che modo asp.net mvc 6 sa quali risorse aggiungere quando un controllore non eredita dalla classe Controller?

Ora, nella nuova versione , non è necessario ereditare dalla classe base Controller. Quindi, la mia domanda è, in che modo asp.net mvc sa quali risorse aggiungere quando un controllore non eredita dalla classe Controller? Ho visto che è possibile aggiungere una proprietà e verrà risolta in fase di esecuzione, ma come si fa nel nucleo di asp.net? C'è un IoC che funziona all'interno del nucleo di asp.net per risolverlo?

risposta

5

MVC 6 individua i controller in base a un tipo che è pubblico e termina con il suffisso Controller. La realtà è un po 'più complicata di così, ed è anche personalizzabile per supportare altre convenzioni, ma questa è l'essenza di ciò.

Oltre a ciò, MVC 6 dispone di un sistema per "idratare" un controller (e visualizzazioni e altri tipi specifici) con i dati richiesti. Ciò avviene principalmente con l'attributo [Activate] che indica a MVC di chiamare nel sistema di iniezione delle dipendenze per popolare le dipendenze su un'istanza di una classe. Si può anche vedere nella classe Controller di base built-in come questo viene fatto:

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

     ... 
    } 
} 

Questo è innescato da DefaultControllerFactory qui:

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

_controllerActivator.Activate(controller, actionContext); 

E questo utilizza un IControllerActivator e, in particolare, lo DefaultControllerActivator che esegue la scansione dello.990.993.338,52321 milioni di attributo e assegna valori alle proprietà:

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

+0

Sai quale parte del ControllerFactory posso vedere dove si viene risolto mediante il nucleo? –

+0

Grazie Eilon! –