Spec-Zone .ru
спецификации, руководства, описания, API
|
Перехватчик является образцом проектирования программного обеспечения, который обеспечивает прозрачный способ расширить или изменить некоторый аспект программы, подобной пользовательскому выходу. Никакая перекомпиляция не требуется. С Соединителем/Сетью перехватчики включаются и отключаются, обновляя строку подключения, чтобы обратиться к различным наборам классов перехватчика, которых Вы инстанцируете.
Соединитель/Сеть включает следующие классы перехватчика:
BaseCommandInterceptor
позволяет Вам выполнять дополнительные операции, когда программа дает команду SQL. Например, можно
исследовать SQL-оператор на журналирование или отладку целей, заменить Вашим собственным набором
результатов, чтобы реализовать кэширующийся механизм и так далее. В зависимости от варианта
использования Ваш код может добавить команду SQL или заменить это полностью.
BaseCommandInterceptor
У class есть эти методы, которые можно
переопределить:
public virtual bool ExecuteScalar(string sql, ref object returnValue);public virtual bool ExecuteNonQuery(string sql, ref int returnValue);public virtual bool ExecuteReader(string sql, CommandBehavior behavior, ref MySqlDataReader returnValue);public virtual void Init(MySqlConnection connection);
Если Ваш перехватчик переопределяет один из Execute...
методы, набор
returnValue
выходной параметр и возврат true
если Вы обработали событие, или false
если Вы не обрабатывали событие. Команда SQL обычно
обрабатывается только, когда все перехватчики команды возвращаются false
.
Соединение, которое передают к Init
метод является соединением, которое
присоединено к этому перехватчику.
BaseExceptionInterceptor
позволяет Вам выполнять дополнительные операции, когда программа встречается с исключением SQL. Механизм
перехвата исключения моделируется после модели Connector/J. Можно кодировать перехватчик class и
соединить его с существующей программой без перекомпиляции, и прервать исключения, когда они создаются.
Можно тогда изменить тип исключения и дополнительно присоединить информацию к этому. Эта возможность
позволяет Вам включать и выключать журналирование и отладку кода без hardcoding что-либо в приложении.
Этот метод применяется к исключениям, повышенным на уровне SQL, не к системе низшего уровня или ошибкам
ввода-вывода.
Вы разрабатываете перехватчик исключения сначала, создавая подкласс BaseExceptionInterceptor
class. Следует переопределить InterceptException()
метод. Можно также
переопределить Init()
метод, чтобы сделать некоторую одноразовую
инициализацию.
У каждого перехватчика исключения есть 2 метода:
public abstract Exception InterceptException(Exception exception, MySqlConnection connection);public virtual void Init(MySqlConnection connection);
Соединение, к которому передают Init()
соединение, которое присоединено
к этому перехватчику.
Каждый перехватчик обязан переопределять InterceptException
и
возвратите исключение. Это может возвратить исключение, которое это дается, или это может обернуть
это в новое исключение. Мы в настоящий момент не предлагаем возможности подавить исключение.
Вот примеры использования FQN (полностью определенное имя) на строке подключения:
MySqlConnection c1 = new MySqlConnection(@"server=localhost;pooling=false;commandinterceptors=CommandApp.MyCommandInterceptor,CommandApp");MySqlConnection c2 = new MySqlConnection(@"server=localhost;pooling=false;exceptioninterceptors=ExceptionStackTraceTest.MyExceptionInterceptor,ExceptionStackTraceTest");
В этом примере вызывают перехватчик команды CommandApp.MyCommandInterceptor
и
существует в CommandApp
блок. Перехватчик исключения вызывают ExceptionStackTraceTest.MyExceptionInterceptor
и существует в ExceptionStackTraceTest
блок.
Чтобы сократить строку подключения, можно зарегистрировать свои перехватчики исключения в Вашем app.config
или web.config
файл как это:
<configSections><section name="MySQL" type="MySql.Data.MySqlClient.MySqlConfiguration, MySql.Data"/></configSections><MySQL><CommandInterceptors> <add name="myC" type="CommandApp.MyCommandInterceptor,CommandApp" /></CommandInterceptors></MySQL><configSections><section name="MySQL" type="MySql.Data.MySqlClient.MySqlConfiguration, MySql.Data"/></configSections><MySQL><ExceptionInterceptors> <add name="myE" type="ExceptionStackTraceTest.MyExceptionInterceptor,ExceptionStackTraceTest" /></ExceptionInterceptors></MySQL>
Как только Вы сделали это, Ваши строки подключения могут быть похожими на них:
MySqlConnection c1 = new MySqlConnection(@"server=localhost;pooling=false;commandinterceptors=myC");MySqlConnection c2 = new MySqlConnection(@"server=localhost;pooling=false;exceptioninterceptors=myE");