2017-02-02 6 views
0

私は、単に適切なIDatabase実装を返す次のファクトリメソッドを持っています。これを私のSimpleInjectorコンテナにリファクタリングしたいのですが、どうしたらよいかわかりません。このファクトリメソッドをどのようにリファクタリングするのですか?

public class DALFactory 
    { 
     public static IDatabase GetDAL() 
     { 
      string asm = "SQL"; /* Hardcoded choice of DAL */ 
      if (asm == "XML") 
       return new XmlDatabase(); 
      if (asm == "SQL") 
       return new SqlDatabase(); 
      return null; 
     } 
    } 

私はコレクションを登録することができます方法を理解しようとしましたが、私のプログラムにするIDatabaseのインスタンスを求めたときにどのように私が使用する1 SimpleInjectorを教えてください?任意のアイデアを公開します。ちょうど理論的なプログラム私は練習のためにリファクタリングしようとしています。 DI(IoC)を初めて使用することは、今までのような快適で目を開く経験でした!

私はこれをやろうとしましたが、私は閉じますか?

Container.RegisterCollection<IDatabase>(new [] { typeof(SqlDatabase), typeof(XmlDatabase)}); 
Container.Register<IDatabase, XmlDatabase>(Lifestyle.Singleton); 
Container.Register<IDatabase, SqlDatabase>(Lifestyle.Singleton); 

答えて

1

asm値が設定ファイルにハードコーディング、または値に基づいて、いずれかの場合には、あなたは、基本的には、実行中のアプリケーションのみIDatabaseの一つの特定のバージョンを持っていると言っています。

これは、このようなとして登録すべきであることを意味します。私は、このような初心者だ

string asm = "SQL"; /* Hardcoded choice of DAL */ 
if (asm == "XML") 
    container.Register<IDatabase, XmlDatabase>(); 
if (asm == "SQL") 
    container.Register<IDatabase, SqlDatabase>(); 
+0

は申し訳ありません。私はコンテナクラスにたくさんのものを登録していますが、実際にはC#クラスであり、Container-librariesメソッドだけに限定されているわけではないことを認識するのを忘れました。答えはとてもシンプルなので、今はとても気分が悪いです。ありがとうございました!!! – Amivit

+0

私はそれをよりテスト可能にしたい場合、この醜いハードコーディングの代わりに、どのような代替ソリューションをお勧めすることができますか?したがって、IDatabaseは模擬実装でもあります。ハードコーディングされたifループに3番目のオプションを追加するか、より良いアプローチがありますか? – Amivit

+0

@Amivit Ehenそれは単体テストになる、答えは全く異なる。単体テストの場合は、コンテナ**を使用しないでください**。手でテストするクラスを構築します。 – Steven

関連する問題