私はウィンザーを使って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>();
あなたが言ったことに比べて、私は道オフベースアム、または私は正しい方向に向かっていますか?
あなたは 'GetData'を登録しましたか? –
どこでGetDataを登録しますか? – czuroski
コンテナに 'GetData'を登録し、それをコンテナから解決する必要があります。 'new GetData()'だけを実行すると、コンテナは何も挿入できません。 –