【问题标题】:AspNet Core AttributeRouting does not discover routes if Startup is in different assembly如果 Startup 在不同的程序集中,AspNet Core AttributeRouting 不会发现路由
【发布时间】:2019-09-24 09:42:20
【问题描述】:

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

实现这一点的一个看似显而易见的解决方案是将Startup.cs 类重构为一个单独的公共程序集(如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-core attributerouting


    【解决方案1】:

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

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

    这将告诉视图/控制器发现也检查新位置。您的包含 Startup.cs 文件的项目将是启动项目,而所有其他项目将只是引用和库或类似的。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-03
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 2013-05-12
      • 1970-01-01
      • 2012-04-13
      相关资源
      最近更新 更多