Аспектно-ориентированное программирование в ASP.NET MVC
В настоящее время я занимаюсь разработкой приложения MVC в ASP.NET, и я пытаюсь разделить проблемы, чтобы в итоге получился более чистый и более обслуживаемый код.
Итак, в качестве отправной точки я думал об аспекте регистрации. Моя идея состоит в том, чтобы регистрировать (первоначально) вызов и возврат каждого метода в каждом контроллере. У меня была бы эта логика в отдельном классе, предназначенном для ведения журналов, поэтому я не путаю свой код с инструкциями журналирования везде.
Мне также необходимо иметь доступ к Http-запросу, чтобы я мог получить информацию о клиенте.
Есть ли интегрированный способ сделать это? Можно ли использовать ASP.NET MVC с файлами аспектов, как AspectJ в Java?
Кроме того, может ли он быть позже настроен для регистрации методов, которые удовлетворяют определенным условиям? (например, подпись, возвращаемое значение, исключение и т. д.)
Большое спасибо заранее!
1 ответ
Вы можете использовать атрибуты для реализации функции аспектно-ориентированным способом. Методы действий, которые вы хотите окружить своей функциональностью, должны быть украшены только вашим атрибутом:
[CustomLogger]
public ActionResult Index()
{
// Doing something here ...
return View();
}
Вы можете либо украсить один метод действия с помощью атрибута, всего контроллера, либо даже применить атрибут глобально через ASP.NET MVC. GlobalFilterCollection
,
Вот как бы вы объявили свой атрибут:
public class CustomLoggerAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
// Here goes your logic
}
// ...
}
ActionFilterAttribute
Класс позволяет переопределить пару методов, чтобы вы могли подключиться к конвейеру выполнения действий ASP.NET MVC:
OnActionExecuting
OnActionExecuted
OnResultExecuting
OnResultExecuted
Вы можете получить доступ к переменным запроса через параметры (например, ActionExecutedContext
), которые передаются вышеуказанным методам.