AddEndpointsApiExplorer
is for Minimal APIs whereas AddApiExplorer
requires, at least, MVC Core. For API projects, AddControllers
calls AddApiExplorer
on your behalf.
But Why Does Everything Still Work With AddEndpointsApiExplorer
?
With the introduction of Endpoint Routing, everything in the routing system boils down to an Endpoint
. ASP.NET Core uses the Application Model, namely ApplicationModel
, ControllerModel
and ActionModel
to create Endpoint
instances and register them with the routing system. Minimal APIs, however, use a builder to directly create and register individual Endpoint
instances.
The default API Explorer implementation provides a IApiDescriptionProvider
that builds ApiDescription
instances from the Application Model. Minimal APIs do not have an Application Model so there is nothing to build ApiDescription
instances from. The API Explorer provides these descriptions, which are commonly used by tools such as OpenAPI generators. Without any descriptions, there would be no support for Minimal APIs and OpenAPI; that would be bad (or, at least, certainly not accepted by developers). To address that, the ASP.NET Core team created a second IApiDescriptionProvider
that only considers Endpoint
.
If Everything is an Endpoint
, Why Not Merge Implementations?
There're two parts to this answer. First, changing the original IApiDescriptionProvider
implementation would introduce a public, breaking change. At a minimum, new constructor arguments would be required. Since it was a major version bump, this approach wasn't off the table, but it turns out to be irrelevant. The bigger issue is that the original IApiDescriptionProvider
implementation and AddApiExplorer
live in and depend on MVC Core. Minimal APIs only require the routing abstractions. There is no way to merge the two without adding unnecessary coupling. To address this problem, AddEndpointsApiExplorer
was added which adds an implementation that only requires an IApiDescriptionProvider
implementation based on bare bones Endpoint
definitions from the routing system.
If AddEndpointsApiExplorer
exists and I call it, do I even need AddApiExplorer
anymore? Maybe. The metadata exposed and available on Minimal API Endpoint
instances is much lighter than the Application Model; after all, they are minimal. Behind the scenes, a IApiDescriptionGroupCollectionProvider
implementation takes a sequence of IApiDescriptionProvider
instances. If AddEndpointsApiExplorer
and AddApiExplorer
are called, then both providers will execute. If only AddEndpointsApiExplorer
is called, it will work with regular 'ol controllers, but the descriptions' information fidelity might be less than what you are accustomed to. If you are only authoring Minimal APIs, then AddEndpointsApiExplorer
is required if you want API Explorer support.
The fidelity between the two methods is improving even more in .NET 7.0. In some future release, it's possible we might see these approaches coalesce into one.
AddMvc
the api explorer services are added for you, but a minimum api setup may not. – CodeAddEndpointsApiExplorer
is new in v6, the implementation is slightly different toAddApiExplorer
. It's surprising that the functionality wasn't merged into the same method. It appears to exist to provide endpoint metadata for "Minimal Api's" learn.microsoft.com/en-us/aspnet/core/fundamentals/… – Code