我将控制器 Controller 按照不同的业务,分为多个不同的项目,我需要在路由里面调度到多个不同项目的控制器

只需要在 Startup 的 ConfigureServices 方法,调用 AddControllers 添加控制器,再加上额外的程序集即可,如下面代码,下面代码的 WeatherForecastController 是定义在另一个程序集的类

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers().AddApplicationPart(typeof(WeatherForecastController).Assembly);
        }

在 AddApplicationPart 方法里面加上你需要加上控制器的项目程序集即可,我推荐使用 typeof 的方法获取程序集里面某个控制器,然后通过 Type 获取程序集的方式传入程序集。传入的程序集里面定义的控制器将会被加入到路由调度

如上图的项目创建方式,创建一个 ASP.NET Core 项目,在里面放一个控制器,将其他的文件都删除。接着再创建一个 ASP.NET Core 项目,删除掉所有的控制器,接着引用刚才第一个创建的项目。此时在第二个项目的 Startup 放入上面代码即可,此时第一个的项目的控制器可以被第二个项目使用到

为了方便调试,我就再创建一个单元测试项目,详细请看 asp dotnet core 基于 TestServer 做集成测试

在这个单元测试项目里面尝试跑起来第二个项目,然后尝试访问第一个项目的控制器

    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            var hostBuilder = CreateHostBuilder();
            var host = hostBuilder.Start();
            var testClient = host.GetTestClient();
            var result = testClient.GetStringAsync("WeatherForecast").Result;
        }

        public static IHostBuilder CreateHostBuilder() =>
            Host.CreateDefaultBuilder()
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                    webBuilder.UseTestServer(); //关键是多了这一行建立TestServer
                });
    }

本文代码放在 githubgitee 欢迎下载执行

第二个方法就是在具体的有控制器的项目里面,添加一个 CommonStartup 类,在这里面调用 AddControllers 方法,如下面代码

    public class CommonStartup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
        }
    }

在入口项目里面调用到 CommonStartup 的 ConfigureServices 方法

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            var commonStartup = new CommonStartup();
            commonStartup.ConfigureServices(services);
        }

以上代码放在 githubgitee 欢迎下载执行


本文会经常更新,请阅读原文: https://blog.lindexi.com/post/ASP.NET-Core-%E5%BC%95%E7%94%A8%E5%85%B6%E4%BB%96%E7%A8%8B%E5%BA%8F%E9%9B%86%E9%A1%B9%E7%9B%AE%E9%87%8C%E9%9D%A2%E7%9A%84-Controller-%E6%8E%A7%E5%88%B6%E5%99%A8.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

如果你想持续阅读我的最新博客,请点击 RSS 订阅,推荐使用RSS Stalker订阅博客,或者收藏我的博客导航

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系

微软最具价值专家


无盈利,不卖课,做纯粹的技术博客

以下是广告时间

推荐关注 Edi.Wang 的公众号

欢迎进入 Eleven 老师组建的 .NET 社区

以上广告全是友情推广,无盈利