Использование PostSharp для перехвата ADO.Net

У меня довольно большая база кода, использующая различные технологии ADO (например, некоторые EF и в некоторых случаях напрямую использующие ADO.Net).

Мне интересно, есть ли способ глобально перехватить любые вызовы ADO.Net, чтобы я мог начать проверку информации - точные выполненные операторы SQL, затраченное время, возвращенные результаты и т. д.

Основная идея заключается в том, что если я смогу это сделать, мне не нужно будет менять какой-либо существующий код и что я должен иметь возможность просто перехватывать/оборачивать вызовы ADO.Net... Возможно ли это?


person vdh_ant    schedule 04.05.2011    source источник
comment
Кажется излишним вопросом. PostSharp, AOP, CciSharp, EF - вместо этого , просто задайте вопрос один раз и охватите все аспекты.   -  person Chase Florell    schedule 08.05.2011
comment
@rockinthexstring Я не согласен. Таким образом, каждый вопрос является более конкретным / целенаправленным, и ОП может сравнивать. ОП может даже использовать количество ответов, просмотров вопросов, голосов и т. Д. В качестве индикаторов общего мнения.   -  person Mauricio Scheffer    schedule 13.05.2011


Ответы (2)


Вы можете глобально перехватывать любые методы, к которым у вас есть доступ (например, ваши сгенерированные модели и контекст). Если вам нужно перехватывать методы в фреймворке BCL, то нет.

Если вы просто хотите получить SQL, сгенерированный из ваших моделей EF, перехватите один из нужных методов с помощью OnMethodBoundaryAspect, и вы можете вести журнал в методах OnEntry и OnExit.

Помните, что вы можете перехватывать только тот код, к которому у вас есть доступ. Сгенерированный код EF доступен, но любые внесенные вами изменения будут перезаписаны, поэтому вам нужно будет применить аспект, используя разделяемый класс или объявление сборки. Я бы предложил последнее, так как вам нужен глобальный перехват.

Просто мои 2 цента: вы можете рассмотреть другие альтернативы для этого, такие как профилировщик SQL или перепроектирование вашей архитектуры.

person Dustin Davis    schedule 04.05.2011
comment
Я работаю над инструментом, который существует в отдельной dll, но является частью работающего приложения. Следовательно, мне нужно перехватить код ADO в другой dll и записать его. - person vdh_ant; 04.05.2011
comment
@vdh_ant это нормально, если у вас есть доступ к этой другой dll и вы можете ее перекомпилировать, в противном случае вы можете в лучшем случае перехватить методы, выполняющие вызовы кода в dll. Существуют проекты, которые позволяют вам переписывать MSIL существующих библиотек DLL, но в этом случае вы играете с огнем. - person Dustin Davis; 04.05.2011

Afterthought – это инструмент с открытым исходным кодом, который поддерживает изменение существующей dll, не требуя перекомпиляции из исходного кода для добавления атрибутов аспекта. . Чтобы это работало, вам нужно будет создать поправки (то, как вы описываете свои изменения в Afterthought) в отдельной dll, и эта dll должна иметь атрибут уровня сборки, реализующий IAmendmentAttribute, который идентифицирует типы в вашей целевой сборке для процесс.

Взгляните на пример ведения журнала, чтобы увидеть, как это работает, и позвольте мне знать, если у вас есть какие-либо вопросы/проблемы.

Обратите внимание, что Afterthought изменяет вашу целевую сборку, чтобы вызывать статические методы в другой сборке (вашем инструменте). Если вы хотите каким-либо образом перехватывать вызовы с модификацией целевой сборки, то рекомендую заглянуть в API профилирования .NET.

Джейми Томас (основной автор Afterthought)

person Jamie Thomas    schedule 06.05.2011