Я пытался понять, как это работает на низком уровне:
[Authorize]
public ActionResult Index()
{
return View();
}
По сути, приведенный выше фрагмент кода, кажется, перехватывает вызовы метода Index, выполняет проверку авторизации и генерирует исключение, если не авторизован. Исключение предотвращает вызов кода в методе Index.
Это кажется очень похожим на АОП, и это нелегко сделать на C #. Если бы я реализовал свой собственный класс, расширяющий System.Attribute, у меня не было бы никакого интерфейса, который можно было бы подключать к предварительному или последующему вызову метода, который украшает мой атрибут. Итак, как это делает атрибут авторизации MVC и как я могу сделать это самостоятельно?
PostSharp - это библиотека, которая выполняет то же самое с помощью IL Weaving. По сути, во время компиляции PostSharp сканирует сборку на предмет методов, украшенных определенными атрибутами, а затем повторно записывает ваш код, чтобы обернуть вызовы ваших методов вызовами других методов.
Фреймворк MVC также выполняет какое-то переплетение IL во время компиляции? Могу ли я выполнить собственное плетение IL? Или есть другие методы для применения тех же принципов АОП без сложного плетения IL?
Я пытался найти информацию о IL Weaving, но все, что я нашел, это статьи о PostSharp. Я бы предпочел держаться подальше от PostSharp из-за проблем с лицензированием, но, более того, я просто хочу знать, как, черт возьми, они это сделали для моего собственного роста как разработчика. Это довольно увлекательно.