web-dev-qa-db-fra.com

Contrôleurs ASP.NET Core MVC dans un assemblage séparé

J'utilise ASP.NET MVC Core RC-2. J'ai un projet web ciblant le framework .NET complet. J'ai également une bibliothèque de classes distincte dans la solution, ciblant également le framework complet.

Dans la bibliothèque de classe, j'ai un contrôleur, marqué d'un attribut d'itinéraire. J'ai référencé la bibliothèque de classes du projet Web. Cet assembly fait référence au package nuget Microsoft.AspNetCore.Mvc v. 1.0.0-rc2-final.

Je croyais comprendre que ce contrôleur externe serait découvert automatiquement, par exemple http://www.strathweb.com/2015/04/asp-net-mvc-6-discovers-controllers/

Cependant, cela ne fonctionne pas pour moi - je navigue vers l'URL de l'itinéraire et j'obtiens une page vierge et elle ne frappe pas le point d'arrêt de mon contrôleur.

Des idées sur la façon de faire fonctionner cela?

Fait intéressant, il semble fonctionner pour les projets Web ciblant .NET Core Framework, référençant une bibliothèque de classes ciblant également .NET Core. Mais pas pour un projet Web ciblant le framework complet, référençant une bibliothèque de classes .NET standard.

Remarque: il s'agit de MVC Core qui est censé prendre en charge ce type de scénario sans aucun MVC <= 4 remplacements de routage .

33
booler

Je crois que vous rencontrez le problème connu suivant dans RC2. https://github.com/aspnet/Mvc/issues/4674 (la solution de contournement est mentionnée dans le bogue)

Cela a été corrigé depuis mais ne sera disponible que dans la prochaine version (sauf si vous êtes d'accord avec l'utilisation des versions nocturnes)

7
Kiran Challa

Toujours un problème dans ASP.Net Core 1.0, je ne sais pas si c'est par conception maintenant. La solution la plus simple consiste à le faire dans Startup.cs/ConfigureServices

services.AddMvc()
  .AddApplicationPart(typeof(<class in external Assembly>).Assembly)
  .AddControllersAsServices();

AddApplicationPart inclut explicitement l'assembly dans les recherches de contrôleurs. L'appel à AddControllersAsServices () ajoutera tous les contrôleurs découverts dans la collection de services, et si vous placez un point d'arrêt après cette ligne et inspectez les `` services '', vous verrez dans la collection tous les types de contrôleurs qui ont été trouvés.

Vous pouvez également vérifier ici: https://docs.asp.net/en/latest/migration/rc1-to-rtm.html#asp-net-5-mvc-compile-views car les règles de découverte sont maintenant modifiées pour les contrôleurs de RC1.

N'oubliez pas non plus d'utiliser IActionResult au lieu d'ActionResult!

66
James Ellis-Jones