如何在ASP.NET Core MVC 2.0中的另一个程序集中使用控制器?

moh*_*eli 17 c# asp.net-core-mvc

为了模块化,我在不同的程序集中创建了一些控制器.每个程序集代表整个系统的有界上下文(模块,子系统,分区等).

每个模块的控制器都是由对其他模块一无所知的人开发的,中央协调器即将在一个应用程序中覆盖所有这些模块.

所以,有一个名为school的模块,它有一个TeacherController.它的输出是Contoso.School.UserService.dll.

主要的协调器被调用Education,它有一个引用Contoso.School.UserService.dll.

program.cs是:

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args).UseKestrel()
            .UseStartup<Startup>()
            .Build();
Run Code Online (Sandbox Code Playgroud)

然而对于教师控制器的路线,我得到404.如何在其他组件中使用控制器?

Paw*_*man 44

对于 .NET Core 3.0 ,API 略有变化,从外部程序集注册控制器的最简单方法Startup.cs如下所示:

public void ConfigureServices(IServiceCollection services)
{
    var assembly = typeof(**AnyTypeFromRequiredAssembly**).Assembly;

    services.AddControllers()
        .PartManager.ApplicationParts.Add(new AssemblyPart(assembly));
}
Run Code Online (Sandbox Code Playgroud)

  • 我在 .NET Core 3.0 中使用旧语法,但仍然得到结果。您还可以提供您的答案的链接以供进一步阅读吗? (2认同)

Mar*_*und 32

在类的ConfigureServices方法中,Startup您必须调用以下内容:

services.AddMvc().AddApplicationPart(assembly).AddControllersAsServices();
Run Code Online (Sandbox Code Playgroud)

assembly实例Assembly代表在哪里Contoso.School.UserService.dll.

您可以加载它从任何包含的类型获取它或像这样:

var assembly = Assembly.Load("Contoso.School.UserService");
Run Code Online (Sandbox Code Playgroud)

  • 它位于“Microsoft.AspNetCore.Mvc.Core.dll”程序集中,并具有“Microsoft.Extensions.DependencyInjection”命名空间 (3认同)
  • 如果引用程序集,可以使用“var assembly = typeof(SomeTypeFromTheAssembly).Assembly” (2认同)
  • 对我来说关键是“AddControllersAsServices()”——非常感谢!! (2认同)

Osk*_*kar 5

我试图在将遗留单元测试从 .NET Framework 迁移到 aspnet core 3.1 时解析控制器,这是我让它工作的唯一方法:

var startupAssembly = typeof(Startup).Assembly;

var services = new ServiceCollection();

// Add services
...

// Add Controllers
services
    .AddControllers()
    .AddApplicationPart(startupAssembly)
    .AddControllersAsServices();
Run Code Online (Sandbox Code Playgroud)

如果我改变最后三行的顺序,它就不起作用。


除非确实需要,即出于遗留原因,否则请避免在单元测试中这样做。如果您不使用遗留代码,您可能正在寻找集成测试