La découverte de Générique Contrôleurs ASP.NET de Base

Je suis en train de créer un contrôleur générique comme ceci:

[Route("api/[controller]")]
public class OrdersController<T> : Controller where T : IOrder
{
    [HttpPost("{orderType}")]
    public async Task<IActionResult> Create(
        [FromBody] Order<T> order)
    {
       //....
    }
}

J'ai l'intention de l' {orderType} URI segment variable pour contrôler le type générique de la manette. Je suis en train d'expérimenter à la fois une coutume IControllerFactory et IControllerActivator, mais rien ne fonctionne. Chaque fois que j'essaie d'envoyer une demande, je reçois une réponse 404. Le code de mon personnalisée contrôleur de l'usine (et activateur) n'est jamais exécutée.

À l'évidence, le problème est que ASP.NET Core attend valide les contrôleurs à la fin, avec le suffixe "Contrôleur", mais mon contrôleur générique à la place, a la (réflexion) suffixe "Contrôleur " 1". Ainsi, l'attribut basé sur les routes, il déclare passent inaperçues.

Dans ASP.NET MVC, au moins dans ses premiers jours, le DefaultControllerFactory a été responsable pour la découverte de tous les contrôleurs disponibles. Il testé pour le "Contrôleur" suffixe:

Le framework MVC fournit un contrôleur par défaut d'usine (nommée DefaultControllerFactory) qui va de la recherche à travers toutes les assemblées dans un domaine d'application à la recherche de tous types qui implémentent IController et dont le nom se termine par "Contrôleur".

Apparemment, dans ASP.NET de Base, le contrôleur de l'usine n'a plus cette responsabilité. Comme je l'ai dit plus tôt, mon custom contrôleur de l'usine s'exécute pour "normal" des contrôleurs, mais n'est jamais invoquée pour générique contrôleurs. Donc, il y a autre chose, plus tôt dans le processus d'évaluation, qui régit la découverte de contrôleurs.

Personne ne sait ce que "service" de l'interface est responsable de cette découverte? Je ne connais pas la personnalisation de l'interface ou "crochet" point.

Et personne ne sait d'une façon de faire de ASP.NET de Base "dump" les noms de tous les contrôleurs qu'il a découvert? Il serait bon d'écrire un test unitaire qui vérifie que tous les contrôleur de découverte, j'attends est en effet à travailler.

D'ailleurs, si il y a un "crochet" qui permet de contrôleur générique des noms à être découvert, il implique que la route des substitutions doit également être normalisé:

[Route("api/[controller]")]
public class OrdersController<T> : Controller { }

Indépendamment de la valeur pour T est donné, l' [controller] nom doit rester une simple base-nom générique. En utilisant le code ci-dessus par exemple, le [controller] valeur doit être "aux Ordres". Il ne serait pas "Commandes " 1" ou "OrdersOfSomething".

Note

Ce problème peut également être résolu en déclarant explicitement les types génériques, au lieu de générer au moment de l'exécution:

public class VanityOrdersController : OrdersController<Vanity> { }
public class ExistingOrdersController : OrdersController<Existing> { }

Les travaux ci-dessus, mais il produit des URI des chemins que je n'aime pas:

~/api/VanityOrders
~/api/ExistingOrders

Ce que j'avais réellement voulu, c'était ceci:

~/api/Orders/Vanity
~/api/Orders/Existing

Un autre réglage qui me reçoit l'URI je suis à la recherche de:

[Route("api/Orders/Vanity", Name ="VanityLink")]
public class VanityOrdersController : OrdersController<Vanity> { }
[Route("api/Orders/Existing", Name = "ExistingLink")]
public class ExistingOrdersController : OrdersController<Existing> { }

Cependant, bien que cela semble fonctionner, il n'a pas vraiment répondu à ma question. Je voudrais utiliser mon contrôleur générique directement au moment de l'exécution, plutôt que de manière indirecte (via manuel de codage) au moment de la compilation. Fondamentalement, cela signifie que je dois ASP.NET de Base pour être en mesure de "voir" ou de "découvrir" mon contrôleur générique, malgré le fait que sa réflexion run-time nom ne se termine pas avec le "Contrôleur" suffixe.

InformationsquelleAutor Brent Arias | 2016-04-17