Я бы использовал вариант 2 выше.
Для тех объектов, которым нужны вспомогательные методы, я бы использовал DI для добавления в них вспомогательного объекта. Это будет более гибким в будущем.
Мне не нравится идея базового объекта со всеми помощниками. Вот почему:
Что если позже вы захотите разбить помощников в нескольких ХФУ? Ты не можешь В зависимости от того, сколько справочных функций у вас есть и сколько они могут вырасти, это может сделать ваши объекты безобразными. Что если у вас когда-нибудь будет 50 вспомогательных функций? Вы действительно хотите, чтобы у ваших контроллеров было 50 дополнительных методов, которые на самом деле не имеют ничего общего с их основной задачей.
Разделение проблем. Контроллеры должны беспокоиться о том, чтобы быть контроллерами. Они не должны быть загружены дополнительными функциями, чтобы они знали, как форматировать строки. Это должно быть обработано StringHelper или чем-то еще.
Два других варианта звучат не очень хорошо. Что такое сфера помощи?