在 Core 之前,當 MVC 和 Web API 的控制器是分開的時,很容易將全域操作定位到一個框架或另一個框架。現在mvcOptions.Filters.Add<T>();它將應用于您的 MVC 視圖呈現操作,并且您是僅 API 操作。
我可以粗略地看到,當您使用[ApiController]( docs ) 時,您選擇了幾個約定/行為,但是我不太清楚如何/是否可以輕松地添加到該約定中。可能我需要創建自己的附加項ApiBehaviorApplicationModelProvider,就像這里的那個?我正在尋找更簡單的東西,比如mvcOptions.ApiConvention.Filters.Add(x).
另一種方法是讓我所有的 API 控制器繼承我自己的控制器ApiControllerBase并對其進行注釋,但如果可能的話,我更愿意擴展約定。
走另一條路也很好,而不必有一個MvcControllerBase用于視圖的任何一個。
uj5u.com熱心網友回復:
[ApiController]我所知道的約定沒有內置的可擴展性,但是您可以使用應用程式模型實作您正在尋找的內容。
這IControllerModelConvention是查找[ApiController]屬性的 的示例實作,您可以使用您的特定實作來填寫:
public class ExampleControllerModelConvention : IControllerModelConvention
{
public void Apply(ControllerModel controllerModel)
{
if (controllerModel.Attributes.OfType<ApiControllerAttribute>().Any())
{
// ...
}
}
}
您可以在.NET 6 Startup.ConfigureServices或Program.cs 中注冊此約定:
// Startup.ConfigureServices
services.AddControllers(options =>
{
options.Conventions.Add(new SampleControllerModelConvention());
});
// Program.cs
builder.Services.AddControllers(options =>
{
options.Conventions.Add(new SampleControllerModelConvention());
});
您鏈接到IsApiController的ApiBehaviorApplicationModelProvider類中的方法處理檢查的方式略有不同:
private static bool IsApiController(ControllerModel controller)
{
if (controller.Attributes.OfType<IApiBehaviorMetadata>().Any())
{
return true;
}
var controllerAssembly = controller.ControllerType.Assembly;
var assemblyAttributes = controllerAssembly.GetCustomAttributes();
return assemblyAttributes.OfType<IApiBehaviorMetadata>().Any();
}
此實作支持[ApiController]應用于控制器所在程式集的屬性。如果您還使用視圖,則可能不需要它,但值得注意的是這種方法的不同之處。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/384703.html
