Prevent ASP.NET Core discovering Controller in separate assembly

Viewed 2123

I've got an ASP.NET Core API that references a nuget package that contains a Controller.

By default, this controller is registered and can respond to requests. However, I only want to add this in certain circumstances - e.g. if it's in the DEV environment.

My Startup looks like this:

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

I expected I'd need to call AddApplicationPart(typeof(ClassInPackage).Assembly) after calling AddCointrollers to register this controller?

Can someone advise a way I can enable / disable the registration of this controller?

1 Answers

Ok, I've found a solution - remove the ApplicationPart that contains the Controller. Any other dependencies in the assembly can still be used.

In Startup.cs / wherever you do your 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);
   }
}

You can also manipulate ApplicationParts via the extension method:

AddMvc().ConfigureApplicationPartManager()

This wasn't suitable for me as I'd written an extension method in my nuget package

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

Related