Какво е AOP? Цитиране на Baidu Encyclopedia: AOP е съкращението от Aspect Oriented Programming, което означава: технология за програмиране, ориентирано към лице, с цел постигане на унифицирано поддържане на програмните функции чрез методи за предварителна компилация и динамични агенти по време на изпълнение. Има два основни начина за реализиране на AOP – единият е статична имплантация по време на компилиране, предимството е високата ефективност, недостатъкът е липсата на гъвкавост, а postsharp под .net е представителят (това е заредено). Другият метод са динамичните проксита, които имат противоположни предимства и недостатъци на първия, динамично създавайки проксита за целевия тип и прихващайки ги чрез прокси повиквания. Това, което AOP може да направи, често използвани случаи са обработка на транзакции, логване и др. Нека поговорим за това как Autofac реализира AOP, Autofac е много добър IOC контейнер под .net и много добра производителност (най-ефективният контейнер под .net), плюс AOP е просто тигър. AOP на Autofac се реализира чрез основната част на проекта Castle (също контейнер), наречена Autofac.Extras.DynamicProxy, който, както подсказва името, е реализиран като динамичен прокси.
Подготовка преди употреба:
Инсталирайте пакета Nuget Autofac, Autofac.Extras.DynamicProxy и след успешна инсталация ще бъдат добавени три референции
Сега официално започна!
Стъпка 1: Създайте интерцептор
По-долу е пример за прост интерцептор, който показва името на прихванатия метод, списък с параметри и резултата от връщането
Стъпка 2: Регистрирайте интерцептора в контейнера Autofac
Прехващачът трябва да бъде регистриран в контейнера на Aufofac, или по типа на прехващача, или по име, което прави метода на използване на прехващача различен (както ще бъде обсъдено по-нататък).
Инжекция на името Строител. Register(c => нов CallLogger(Console.Out)). <IInterceptor>Именувани ("лог-calls");
Инжекция на типове Строител. Register(c => нов CallLogger(Console.Out));
Стъпка 3: Активирайте интерцептора
Има два основни начина за активиране на интерцептора: EnableInterfaceInterceptors(), EnableClassInterceptors().
Методът EnableInterfaceInterceptors динамично създава интерфейсен прокси
Методът EnableClassInterceptors ще създаде прокси клас на подклас на целевия клас и тук трябва да се отбележи, че той ще прихваща само виртуалния метод и ще презапише метода
Активирайте примерен код на Interceptor:
Стъпка 4: Посочете типа, който искате да прихванете
Има два начина:
Първият тип: Добавете атрибут на характеристика към типа
Вторият тип е динамично инжектиране на интерцептора, когато регистрационният тип се прехвърли в контейнера
Стъпка 5: Тествайте ефекта
1. Прокси прихващане
Класов код на кръга:
2. Интерфейсно прокси прихващане
IShape интерфейсен код:
Класов код на кръга:
|