Я согласен с Тофером в целом.
В контексте ASP.NET и приведенного вами примера, я думаю, наилучшим подходом было бы, чтобы все ваши модули реализовали свою собственную логику поиска и представили ее с помощью метода. Затем результат поиска будет вызывать метод для получения результатов от всех компонентов / модулей в системе, которые осуществляют поиск.
Как правило, у вас должна быть какая-то платформа для базовой системы, а компоненты должны быть абстрагированы (интерфейсы для общей функциональности). Простое эмпирическое правило заключается в том, что «компонент вызывается, а фреймворк вызывает компоненты».
Поскольку поиск будет реализован по-разному в зависимости от компонента, задача компонента - реализовать его, а задача платформы - вызвать реализацию.
В качестве заключительного замечания, я думаю, у вас должна быть архитектура для всей системы, прежде чем вы начнете думать о конкретных примерах, как сказал Топер.