2011-05-20 4 views
2

私はウィンザーを使ってdiを学ぼうとしていて、問題に遭遇しています。私は使用している既存のDALを持っており、このdalでdiを使いたいと思います。城ウィンザーを使用しているdiの問題

public interface IConnection 
    { 
     void OpenConnection(string ConnectionStringName); 
     void CloseConnection(); 
     DbDataReader ExecuteReader(string query); 
    } 

と実装 - - 私はインターフェイス以下(この記事のために簡略化され)ている。ここ

public class Connection : IConnection 
    { 
     private DBManager manager = new DBManager(); 

     public void OpenConnection(string ConnectionStringName) 
     { 
      manager.OpenConnection("connectionstringname"); 
     } 

     public void CloseConnection() 
     { 
      manager.CloseConnection(); 
     } 

     public DbDataReader ExecuteReader(string query) 
     { 
      return manager.ExecuteReader(query, CommandType.Text); 
     } 
    } 

である私のウィンザーのインストーラ - ここ

public void Install(IWindsorContainer container, IConfigurationStore store) 
     { 
      container.Register(
       Component.For<IConnection>().ImplementedBy<Connection>() 
       .LifeStyle.Transient 
       ); 
     } 

とはどこです私は注射をしています -

public class GetData 
    { 
     private IConnection conn; 

     public GetData() 
     { 
     } 

     public GetData(IConnection conn) 
     { 
      this.conn = conn; 
     } 

     public List<Entity> GetAllData() 
     { 
      List<Entity> data= new List<Entity>(); 
      //IConnection conn = new Connection(); 
      conn.OpenConnection("connectionstringname"); 

      try 
      { 
       var r = conn.ExecuteReader("select ... from ..."); 
       //code to convert reader to data list 
       r.Dispose(); 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 
      finally 
      { 
       conn.CloseConnection(); 
      } 

      return data;    
     } 
    } 

注射が機能していません。コードをステップ実行すると、GetAllDataでconnが常にnullになります。 インストーラをステップ実行すると、IConnection/Connectionの依存関係が存在し、必要な依存関係をすべて解決できるというメッセージが表示されます。

誰かが私が間違っていることを見ることができますか?私が言ったように、私はdiに新しいので、私が間違ってそれを使用している場合、私に知らせてください。

おかげ

EDIT - 私は理解して完全にはよく分かりません。私は次のように私のインストーラを変更した場合、それはまだ動作していない -

container.Register(
       Component.For<IConnection>().ImplementedBy<Connection>() 
       .LifeStyle.Transient 
       ); 

      container.Register(
       Component.For<GetData>() 
       ); 

      container.Resolve<GetData>(); 

あなたが言ったことに比べて、私は道オフベースアム、または私は正しい方向に向かっていますか?

+0

あなたは 'GetData'を登録しましたか? –

+0

どこでGetDataを登録しますか? – czuroski

+1

コンテナに 'GetData'を登録し、それをコンテナから解決する必要があります。 'new GetData()'だけを実行すると、コンテナは何も挿入できません。 –

答えて

1

てくださいと私は間違っているかもしれないが、私はあなたがcontroller injectionで自動的に取り組んでこれを取得することができ、あなたはASP.NET MVCで働いている場合は、

container.Resolve 

を呼び出して気付かなかったが、あなたはまだしませんインターフェイスをある種のファクトリメソッドにフックする必要があります。あなたのサンプルで私は追加します

public class GetData 
{ 
    private IConnection conn = ContainerManager.Instance.Resolve<IConnection>(); 
    //where ContainerManager.Instance points to the container instance 
    ... 
} 
+0

私はMVCを使用しています。コントローラインジェクションが動作しています。あなたが言った場所、またはWindsorControllerFactory内のcontainer.resolveを呼び出すのが最善でしょうか? – czuroski

+0

@czuroskiああ私は参照してください。私はASP.NET MVCインジェクションを** Controller Injection **以外に使用することはできないと思うので、実際にはそうではないかもしれませんが、ASP.NETには組み込みの工場があるので使用できませんシーンの後ろに自動的に立ち上がります。私のプロジェクトでは、 'Resolve'ロジックをすべて含む基本クラスを作成し、このベースから型を継承します。 – oleksii

0

あなたはinstall()を呼び出しましたか?例えば:

container.Install(Castle.Windsor.Installer.Configuration.FromAppConfig()); 
関連する問題