Dans un souci de modularité, j'ai créé des contrôleurs dans différents assemblages. Chaque assemblage représente un contexte borné (un module, un sous-système, une division, etc.) du système global.
Les contrôleurs de chaque module sont développés par quelqu'un qui ne connaît rien des autres modules, et un orchestrateur central est sur le point de couvrir tous ces modules dans une seule application.
Donc, il y a ce module appelé école, et il contient un TeacherController
. La sortie de celui-ci est Contoso.School.UserService.dll
.
L'orchestrateur principal s'appelle Education
et il a une référence à Contoso.School.UserService.dll
.
Ma program.cs
est:
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args).UseKestrel()
.UseStartup<Startup>()
.Build();
Pourtant, pour les routes du contrôleur de l'enseignant, j'obtiens 404. Comment utiliser les contrôleurs dans d'autres assemblages?
Dans la méthode ConfigureServices
de la classe Startup
, vous devez appeler ce qui suit:
services.AddMvc().AddApplicationPart(Assembly).AddControllersAsServices();
Où Assembly
est l'instance Assembly
représentant Contoso.School.UserService.dll
.
Vous pouvez le charger en le récupérant à partir de n'importe quel type inclus ou comme ceci:
var Assembly = Assembly.Load("Contoso.School.UserService");
Martin ci-dessus a la réponse, merci. Cependant, il n'est pas immédiatement évident de savoir comment passer un assembly à Startup.ConfigureServices. Comment j'ai réussi cela ... dans le code où je crée et démarre le webHost, j'appelle IWebHostBuilder.ConfigureServices et je lui donne quelque chose contenant l'assembly (dans mon cas, une interface personnalisée appelée IOutputProcess)
_webHost = CreateWebHostBuilder().ConfigureServices(e => e.AddSingleton(_outputProcess)).Build();
_webHost.Start();
puis dans mon Startup.ConfigureServices, je retire cette instance de IServiceCollection avec ...
public void ConfigureServices(IServiceCollection services)
{
var sp = services.BuildServiceProvider();
var outputProcess = sp.GetService<IOutputProcess>();
services.AddMvc().AddApplicationPart(outputProcess.ControllerAssembly).AddControllersAsServices();
}
Je doute que l'instanciation d'un fournisseur de services uniquement à cette fin soit la façon la plus propre de faire les choses, mais cela fonctionne. (Je suis ouvert à de meilleures idées)