Аспектно-ориентированное программирование в 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), которые передаются вышеуказанным методам.

Другие вопросы по тегам