web-dev-qa-db-fra.com

Comment utiliser un contrôleur dans un autre assembly dans ASP.NET Core MVC 2.0?

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();

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");
27
Martin Zikmund

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)

0
andrew pate