Есть много способов сделать это.
Первый : Вы можете создать свой собственный базовый контроллер и реализовать OnActionExecution
, как и раньше.См. Образец ниже, чтобы получить информацию от ActionExecutingContext
.
Если вы пойдете этим путем, каждый контроллер, который унаследует от этого базового контроллера, получит реализацию регистратора, потому что вы переопределяете OnActionExecuting
(который применяется ко всем действиям вашего контроллера).
public override void OnActionExecuting(ActionExecutingContext context)
{
//How do I get the current controller?
string controllerName = context.ActionDescriptor.ControllerDescriptor.ControllerName
//How do I get the current method being called?
string actionName = context.ActionDescriptor.ActionName;
//How can I pass in additional parameters?
foreach (var parameter in context.ActionParameters)
{
var parameterKey = parameter.Key;
var parameterValue = parameter.Value;
}
//How can I get the user?
var user = this.User; // IPrinciple instance, explore this object
logger.LogWarning("Loaded BaseController");
base.OnActionExecuting(context);
}
Секунда: С другой стороны, вы можете использовать ActionFilters , который наследует класс ActionFilter
и выполняет ту же реализацию в этом классе, переопределяя OnActionExecuting
.Затем вы можете украсить свои контроллеры этим атрибутом, чтобы сделать регистратор.Учитывая, что это атрибут, вы должны определить имя класса с суффиксом Attribute
и использовать без него.Например:
public class LoggerAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
// same code above
}
}
[Logger]
public class CustomerController : Controller
{
// actions code...
}
Третий : используйте тот же класс фильтра действий и вместо применения ко всем нужным классам вы определяете его как глобальный фильтр действий, и он будет применяться квсе контроллеры.Вы должны определить его на GlobalFilter
, и если вы используете шаблон по умолчанию asp.net mvc, вы можете определить его на FilterConfig.cs
, для образца:
filters.Add(new LoggerAttribute());