如何有条件地从 ASP.NET Core 注册并添加到 ServiceCollection 中删除控制器

nik*_*3ro 5 c# asp.net-core-mvc .net-core asp.net-core

我们有标准的 ASP.NET Core 解决方案,Microsoft.Extensions.DependencyInjection需要根据配置设置注册某些控件。

某些ApiController继承自的示例ControllerBase及其所有相关操作仅应在某些bool为真时注册。

这可能吗?我看了看,services.AddMvc()但没有看到任何可以轻松让我执行以下操作的选项:

  • 防止某些人ExampleController被注册
  • 注册后删除ExampleController及其所有相关操作IServiceCollection

tim*_*mur 6

正如评论中所指出的,实现功能过滤器并将其注册到您的服务配置中:

public class MyFeatureProvider: ControllerFeatureProvider
    {
        private readonly bool condition;

        public MyFeatureProvider(bool condition)
        {
            this.condition = condition;
        }
        protected override bool IsController(TypeInfo typeInfo) {
            if (condition && typeInfo.Name == "ExampleController") {
                return false;
            }
            return base.IsController(typeInfo);
        }
    }

public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {            
            services.AddMvc().ConfigureApplicationPartManager(mgr => {
                mgr.FeatureProviders.Clear()
                mgr.FeatureProviders.Add(new MyFeatureProvider(true));
            });            
        }
}
Run Code Online (Sandbox Code Playgroud)

我将链接源代码,以防您想查看库存标准实现并查看其工作原理以供参考

  • @Roel您可能只想删除现有的“ControllerFeatureProvider”,而不是所有“FeatureProvider”。 (2认同)