Я бы лично использовал IThingExtensions
.
С точки зрения удобства использования конечный пользователь никогда не видит этот класс - он включает только его пространство имен. Если пространство имен совпадает с IThing
, то это не имеет значения - оно уже будет у него.
При этом я думаю, что тот факт, что это расширения для любого IThing
, делает IThingExtensions
наиболее очевидным. Если у вас есть класс Thing
, вызов этого ThingExtensions
может показаться неоднозначным (расширяете ли вы интерфейс или саму реализацию?).
При этом в каркасе используется совершенно другой подход. Подход фреймворка заключается в использовании класса с именем Thing
для расширения IThing
. Для примеров см. Enumerable (расширение IEnumerable
) и Queryable (расширение IQueryable
). Это также было бы очень хорошим вариантом.