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)
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)
我试图在将遗留单元测试从 .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)
如果我改变最后三行的顺序,它就不起作用。
除非确实需要,即出于遗留原因,否则请避免在单元测试中这样做。如果您不使用遗留代码,您可能正在寻找集成测试。