我正在尝试使用windsor学习di并遇到问题。我有一个我正在使用的现有DAL,我想用这个dal使用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);
}
}
这是我的windsor安装程序 -
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中始终为null。 当我逐步完成安装程序时,会出现IConnection / Connection依赖关系,它表示可以解决所有必需的依赖关系。
任何人都能看到我做错的事吗?正如我所说,我是迪新手,所以如果我使用不正确,请告诉我。
感谢
修改 - 我不完全确定我理解。如果我将安装程序更改为以下内容,它仍无法正常工作 -
container.Register(
Component.For<IConnection>().ImplementedBy<Connection>()
.LifeStyle.Transient
);
container.Register(
Component.For<GetData>()
);
container.Resolve<GetData>();
与你所说的相比,我是否会偏离基地?或者我是朝着正确的方向前进的?
答案 0 :(得分: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
...
}
答案 1 :(得分:0)
container.Install(Castle.Windsor.Installer.Configuration.FromAppConfig());