Skip to content

Custom Attributes

Chris Martinez edited this page Jan 8, 2023 · 1 revision

In addition to the API versioning options, there are few other customization and extension points. Attributes are the primary mechanism used to decorate the API version metadata with a specific controller type, but the attributes used can be any IApiVersionProvider.

public interface IApiVersionProvider
{
    ApiVersionProviderOptions Options { get; }
    IReadOnlyList<ApiVersion> Versions { get; }
}

There are several API version provider attributes defined out-of-the-box:

  • ApiVersionsBaseAttribute
  • ApiVersionAttribute
  • MapToApiVersionAttribute
  • AdvertiseApiVersionsAttribute

These attributes are themselves extensible. For example, you might choose to have your own attributes that are unambiguously a specific version:

[AttributeUsage( AttributeUsage.Class, AllowMultiple = true, Inherited = false )]
public sealed class V1Attribute : ApiVersionAttribute
{
    public V1Attribute() : base( new ApiVersion( new( 2016, 7, 1 ) ) ) { }
}

[V1]
[ApiController]
[Route( "api/[controller]" )]
public class HelloWorldController : ControllerBase
{
    [HttpGet]
    public string Get() => "Hello world!";
}

This approach can help centralize API version management and avoid developer typographical errors when implementing a set of services that all use the same API version.

Clone this wiki locally