Это зависит скорее от ваших реальных требований.
Для простого / образца / прототипа приложения winforms я бы предложил базовые обработчики событий WinForms с кодом (при условии, что он не слишком тяжелый) в методах обработчика. Если код тяжелый, содержит жесткие бизнес-правила и не взаимодействует с формой, то лучше переместить этот код в другой класс и вызвать его из обработчика событий.
Аспектно-ориентированное программирование принимает это далее. Как правило, лучше всего применять в крупных проектах. Вам по-прежнему нужны обработчики событий для элементов формы (и я рекомендую придерживаться основанных на элементах управления обработчиков событий - не пытайтесь создать собственную глобальную функцию обработки событий), но они должны совершать вызовы объектов Command (см. Шаблон команды в GangOfFour). Эти командные объекты могут быть вызваны из любого места в вашем приложении. Если вы хотите инструментарий, инструментарий должен быть на этих объектах Command, а не на событиях WinForms. Вы можете использовать Inversion of Control контейнеры, такие как Castle Windsor , чтобы вводить протоколирование / аудит в команды без необходимости вообще менять приложение, используя Interceptor pattern . Вот пример от Дэвида Хейдена