如果我有以下代码,使用IoC(我们计划使用Castle Windsor)替换它的最佳实践/设计考虑是什么?由于“using”语句负责创建连接对象,因此无法直接将其注入构造函数或方法中。注意:在这里使用SQL连接作为一个干净的例子,主要好处是模拟/单元测试。
public void CustomerRespository
{
....
public void Save(Customer customer)
{
using (var cn = new SqlConnection(connectionString))
{
using (var cm = new SqlCommand(commandString, cn))
{
....
cn.Open();
cm.ExecuteNonQuery();
}
}
}
}
我相信至少有几个选项可供选择,但由于我们刚刚开始使用IoC,我不确定它们是否会在以后引起问题和/或与IoC的概念相抵触。我的首选方法是修改方法如下,有人能否指出潜在问题?
public interface IDatabase
{
IDbConnection Connection(string connectionString);
IDbCommand Command(string text, IDbConnection conn);
}
public class SqlDB : IDatabase
{
IDbConnection Connection(string connectionString)
{ return new SqlConnection(connectionString); }
IDbCommand Command(string text, IDbConnection conn)
{ return new SqlCommand(text, conn); }
}
public interface ICustomerRespository
{
void Save(Customer customer)
}
public class CustomerRespository : ICustomerRespository
{
public IDatabase DB{get; private set;}
public CustomerRespository( IDatabase db)
{
DB = db;
}
....
public void Save(Customer customer)
{
using (var cn = DB.Connection(connectionString))
{
using (var cm = DB.Command(commandString, cn))
{
....
cn.Open();
cm.ExecuteNonQuery();
}
}
}
}