Rubyの依存性注入フレームワークは、ほとんど不要と宣言されています。 Jamis Buckはこの昨年、ブログ記事LEGOs, Play-Doh, and Programmingにこう書いています。Rubyによるランタイム実装の置換
一般的に受け入れられている代替案は、ある程度のコンストラクタインジェクションを使用しているようですが、デフォルトを提供するだけです。
class A
end
class B
def initialize(options={})
@client_impl = options[:client] || A
end
def new_client
@client_impl.new
end
end
このアプローチは、私が細かいですが、より伝統的なセットアップから一つ欠けているようだ:一部の外部スイッチに基づいて実行時に実装を置換する方法を。私はこの(pesudo-C#の)のような何かができる依存性注入フレームワークと例えば
:
if (IsServerAvailable)
container.Register<IChatServer>(new CenteralizedChatServer());
else
container.Register<IChatServer>(new DistributedChatServer());
この例で私たちのcenteralizedサーバーが利用可能であるかどうかに応じて、異なるIChatServer
実装を登録します。
Rubyでコンストラクタを使用しているだけなので、使用する依存関係をプログラムで制御することはできません(それぞれ独自に指定しない限り)。 Jamisが提供する例は、クラスをよりテスト可能にするのに適しているようですが、置換のための機能が不足しているようです。
私の質問は、どのようにRubyでこの状況を解決するのですか?私は "あなたはただそれをする必要はありません"を含め、どんな答えにもオープンしています。これらの問題についてRubyの視点を知りたいだけです。