c# - 如果 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)
{
}
}
解决方案
您可以通过将以下语句添加到您的Startup.cs
方法中的服务来解决此问题。
services.AddApplicationPart(typeof(AnTypeInTheOtherAssembly).Assembly);
这将告诉 View/Controller Discovery 也检查新位置。包含该Startup.cs
文件的项目将是启动项目,所有其他项目将只是引用和库或类似的。
从 .Net Core 3 开始,您可以使用名为的东西Razor Class Libraries
,请参阅MSDN。这将自动将您的控制器和视图添加到发现中,它还具有调试支持,并且可以像普通类库一样工作。
推荐阅读
- c# - ASP .NET Core 更改默认 ApiController BadResponse
- api - 火币签名总是返回“签名无效”:验证失败
- python - 根据 np.random.random 的结果制定 if/elif 语句的更有效方法?
- load-balancing - AutoScaling 环境监控
- sql-server - SQL 代理弄乱了连接字符串中的特殊字符
- django - NGINX HTTP 499 与 AWS NLB 和 Gunicorn _ Django
- ios - 如何在 iOS 的键盘上方添加完成按钮?
- javascript - Node.js - 加载所有文件,还是不加载所有文件,这是我的问题
- postgresql - 将参数传递给视图
- openstack - 如何在没有源代码补丁的情况下将自定义计算驱动程序连接到 openstack nova-compute?