2011-05-20 44 views
2

我想學習使用windsor迪和我遇到問題。我有一個現有的DAL,我正在使用,我想用這個dal使用di。我有以下接口(簡化了這個帖子的緣故) -使用城堡windsor迪的問題

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;    
     } 
    } 

注射不起作用。如果我單步執行代碼,conn在GetAllData中始終爲空。 當我在安裝程序中逐步完成時,IConnection/Connection依賴關係在那裏,它表示可以解決所有必需的依賴關係。

任何人都可以看到我做錯了什麼嗎?正如我所說,我是di新手,所以如果我錯誤地使用它,請告訴我。

感謝

編輯 - 我不能完全肯定我明白了。如果我改變我的安裝程序下面,它仍然不能正常工作 -

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

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

      container.Resolve<GetData>(); 

我是大錯特錯比你說的,還是我在正確的方向前進嗎?

+0

你註冊了'GetData'嗎? – 2011-05-20 13:16:30

+0

我在哪裏註冊GetData? – czuroski 2011-05-20 13:22:03

+1

您需要在容器中註冊'GetData',然後從容器中解析它。如果你只是做'新的GetData()'容器不能注入任何東西。 – 2011-05-20 13:50:25

回答

1

不知道,我可能是錯的,但我沒有注意到你打電話

container.Resolve 

如果你已經在ASP.NET MVC的工作,你可以得到這個與controller injection自動工作,但你仍然會需要將界面掛接到某種工廠方法。在您的示例中,我將添加

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

我正在使用MVC,我有我的控制器注入工作。最好是在你說的地方或在我的WindsorControllerFactory中調用container.resolve? – czuroski 2011-05-20 13:27:11

+0

@czuroski哦,我明白了。我不認爲你可以使用ASP.NET MVC注入除了**控制器注入**,所以我認爲(可能不是真的),你不能使用它,因爲ASP.NET有內置的工廠被掛鉤在場景後自動啓動。在我的項目中,我創建了一個包含所有'Resolve'邏輯的基類,並從此基類繼承類型。 – oleksii 2011-05-20 13:43:23

0

您打電話給install()嗎?例如:

container.Install(Castle.Windsor.Installer.Configuration.FromAppConfig());