Ruby - это объектно-ориентированный, но динамически типизированный язык. Будучи динамическим языком, rubyists, как правило, используют отражения и динамическое изменение кода гораздо чаще, чем разработчики .net. Конечно, поскольку это объектно-ориентированный язык, вы можете использовать в основном те же принципы, что и в .net, и вы тоже должны это делать, но всегда оглядывайтесь вокруг и смотрите, как эта же вещь может быть реализована более динамичным способом.
Например, ActiveRecord ORM решает композицию, используя метод selected_of , который динамически добавляет соответствующие поля и свойства в ваш класс. Я не говорю, что это именно так, как это должно быть сделано (например, DataMapper, который является еще одним ORM для ruby, выбирает более «консервативный» подход и поэтому больше напоминает (Свободно) NHibernate), это всего лишь пример как все можно сделать по-другому.
Такие вещи, как AOP или DI, не являются чужеродной концепцией для динамических языков, они обычно выполняются альтернативным способом. Держите непредвзятое мнение о динамических аспектах языка, но не переусердствуйте с ними.