动作过滤器:如何调用服务层和异步方法
Action filter : how to call service layer and async method
我有一个带有很多操作方法的控制器。我的要求是检查数据库中字段的值,如果字段值为“true”,则所有操作方法都可以执行,否则这些操作方法不应执行。
方法在服务层
public class CustomAttributeFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var myFlag = await _adminDB.GetFlagSettingsAsync();
// how do i call async method from OnActionExecuting filter
if (!myFlag)
{
//Create your result
filterContext.Result = new EmptyResult();
}
else
{
base.OnActionExecuting(filterContext);
}
}
}
接口实现
public interface IAdminDB
{
Task<MySettings> GetMySettingsAsync();
}
public class AdminDB : IAdminDB
{
public async Task<MySettings> GetMySettingsAsync()
{
var dbName = _appSettings.AdminDbName;
var blobName = _appSettings.AdminBlobName;
return await _dbStorage.GetBlobAsync<MySettings>(blobName, dbName);
}
}
public class MySettings
{
public bool MyFlag { get; set; }
}
我收到一条错误消息“找不到合适的方法来覆盖”。我如何清除此错误以及如何正确注入服务。以上是我试过的,异步调用在这里失败了。
我在您的代码中看不到 _adminDB 依赖项的来源,但我猜这是导致问题的原因。
如果你想使用异步过滤器,你必须实现 IAsyncActionFilter 接口。
您可以从执行上下文的 DI 容器中检索服务并通过以下方式使用异步方法:
public class CustomAttributeFilter : ActionFilterAttribute
{
public override async Task OnActionExecutionAsync(
ActionExecutingContext context, ActionExecutionDelegate next)
{
var adminDb = filterContext.HttpContext.RequestServices.GetService<AdminDb>();
var myFlag = await adminDb.GetFlagSettingsAsync();
//..
await next();
}
}
根据您的需要,您也可以将自定义逻辑放在 next() 调用之后。
有关详细信息,请参阅 documentation。
我有一个带有很多操作方法的控制器。我的要求是检查数据库中字段的值,如果字段值为“true”,则所有操作方法都可以执行,否则这些操作方法不应执行。 方法在服务层
public class CustomAttributeFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var myFlag = await _adminDB.GetFlagSettingsAsync();
// how do i call async method from OnActionExecuting filter
if (!myFlag)
{
//Create your result
filterContext.Result = new EmptyResult();
}
else
{
base.OnActionExecuting(filterContext);
}
}
}
接口实现
public interface IAdminDB
{
Task<MySettings> GetMySettingsAsync();
}
public class AdminDB : IAdminDB
{
public async Task<MySettings> GetMySettingsAsync()
{
var dbName = _appSettings.AdminDbName;
var blobName = _appSettings.AdminBlobName;
return await _dbStorage.GetBlobAsync<MySettings>(blobName, dbName);
}
}
public class MySettings
{
public bool MyFlag { get; set; }
}
我收到一条错误消息“找不到合适的方法来覆盖”。我如何清除此错误以及如何正确注入服务。以上是我试过的,异步调用在这里失败了。
我在您的代码中看不到 _adminDB 依赖项的来源,但我猜这是导致问题的原因。
如果你想使用异步过滤器,你必须实现 IAsyncActionFilter 接口。
您可以从执行上下文的 DI 容器中检索服务并通过以下方式使用异步方法:
public class CustomAttributeFilter : ActionFilterAttribute
{
public override async Task OnActionExecutionAsync(
ActionExecutingContext context, ActionExecutionDelegate next)
{
var adminDb = filterContext.HttpContext.RequestServices.GetService<AdminDb>();
var myFlag = await adminDb.GetFlagSettingsAsync();
//..
await next();
}
}
根据您的需要,您也可以将自定义逻辑放在 next() 调用之后。
有关详细信息,请参阅 documentation。