【问题标题】:Prevent ASP.NET Core discovering Controller in separate assembly防止 ASP.NET Core 在单独的程序集中发现控制器
【发布时间】:2020-11-11 15:43:55
【问题描述】:

我有一个 ASP.NET Core API,它引用了一个包含 Controller 的 nuget 包。

默认情况下,此控制器已注册并且可以响应请求。但是,我只想在某些情况下添加它 - 例如如果它在 DEV 环境中。

我的Startup 看起来像这样:

services.AddControllers()
.AddMvcOptions(cfg => {
   cfg.Filters.Add(new CustomExceptionFilterAttribute())
});

我希望在调用AddCointrollers 后需要调用AddApplicationPart(typeof(ClassInPackage).Assembly) 来注册此控制器?

有人可以建议我启用/禁用此控制器注册的方法吗?

【问题讨论】:

  • 这能回答你的问题吗? Conditionally disable ASP.NET MVC Controller
  • @DavidEdel 它会阻止操作方法的执行,但端点仍然会在 swagger 等上可见,所以理想情况下我们也可以将它隐藏在那里..
  • 如果像这样的条件指令 #if DEBUG ..... #endif 可以帮助你吗?你也可以使用属性路由。

标签: asp.net-core .net-core


【解决方案1】:

好的,我找到了解决方案 - 删除包含 ControllerApplicationPart。仍然可以使用程序集中的任何其他依赖项。

在 Startup.cs / 任何你做 IoC 的地方:

if(hideControllerFromOtherAssembly)
{
   var appPartManager = (ApplicationPartManager)services.FirstOrDefault(a => a.ServiceType == typeof(ApplicationPartManager)).ImplementationInstance;
   var mockingPart = appPartManager.ApplicationParts.FirstOrDefault(a => a.Name == "MyMockLibrary.Namespace");

   if(mockingPart != null)
   {
      appPartManager.ApplicationParts.Remove(mockingPart);
   }
}

您还可以通过扩展方法操作ApplicationParts

AddMvc().ConfigureApplicationPartManager()

这不适合我,因为我在我的 nuget 包中编写了扩展方法

https://docs.microsoft.com/en-us/aspnet/core/mvc/advanced/app-parts?view=aspnetcore-5.0

【讨论】:

  • 只是一个旁注。只是想象某人已经创作了许多高度可定制的控制器。您是此类控制器库的用户。你很挑剔,不想拥有所有控制器。您真的要作为客户手动移除所有控制器吗?????
猜你喜欢
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 2016-08-09
  • 2022-07-09
  • 1970-01-01
相关资源
最近更新 更多