首页 > 解决方案 > 如果 Startup 在不同的程序集中,AspNet Core AttributeRouting 不会发现路由

问题描述

我有一个场景,我们有许多小型 AspNet Core 网站的“标准化启动”。

实现这一点的一个看似显而易见的解决方案是将Startup.cs类重构为一个单独的公共程序集(as Infrastructure.Web.Core.Startup)。然后,我们让每个小型 AspNet Core 网站引用它作为通用程序集,并改用该启动类:

        public static Microsoft.AspNetCore.Hosting.IWebHostBuilder CreateWebHostBuilder( string[] args )
        {
            return new WebHostBuilder()
                   .UseKestrel()
                   .ConfigureServices( collection => { } )
                   .UseContentRoot( System.IO.Directory.GetCurrentDirectory() )
                   .UseStartup<Infrastructure.Web.Core.Startup>(); //.UseStartup<Startup>();
        }

不知何故,这会破坏属性路由,因为路由没有被命中。没有错误,但没有路由。当我将课程复制回网站项目(使用完全相同的代码)时,它再次工作

作为测试,如果我将 Startup.cs 类包装在本地启动类的公共库中(如下所示),它也可以工作:

    public class Startup
    {
        private readonly Infrastructure.Web.Core.Startup _startup;

        public Startup( IConfiguration configuration )
        {
            _startup = new Infrastructure.Web.Core.Startup( configuration );
        }

        public IConfiguration Configuration => _startup.Configuration;

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices( IServiceCollection services )
        {
            _startup.ConfigureServices( services );
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure( IApplicationBuilder app, IHostingEnvironment env )
        {
            _startup.Configure( app, env );
        }
    }

如果我不得不猜测,这可能与依赖注入有关。

有没有人有什么建议?

仅供参考:它使用的是典型的 AspNet Core 2.1 项目

更新 顺便说一句,如果我使用继承,它也可以工作,但派生类必须与网站在同一个项目中。我想这似乎很明显,但为了完整起见,我认为我包含了该信息:

    public class Startup : Infrastructure.Web.Core.Startup
    {
        public Startup( IConfiguration configuration ) : base(configuration)
        {
        }
    }

标签: c#asp.net-coreattributerouting

解决方案


您可以通过将以下语句添加到您的Startup.cs方法中的服务来解决此问题。

services.AddApplicationPart(typeof(AnTypeInTheOtherAssembly).Assembly);

这将告诉 View/Controller Discovery 也检查新位置。包含该Startup.cs文件的项目将是启动项目,所有其他项目将只是引用和库或类似的。

从 .Net Core 3 开始,您可以使用名为的东西Razor Class Libraries,请参阅MSDN。这将自动将您的控制器和视图添加到发现中,它还具有调试支持,并且可以像普通类库一样工作。


推荐阅读