Использование PostSharp для перехвата ADO.Net - PullRequest
1 голос
/ 04 мая 2011

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

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

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

Ответы [ 2 ]

1 голос
/ 06 мая 2011

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

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

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

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

1 голос
/ 04 мая 2011

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

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

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

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

...