如果我有下面的代碼,用IoC代替它的最佳實踐/設計認證(我們正在使用Castle Windsor)。由於「using」語句負責創建連接對象,因此不能直接將其注入到構造函數或方法中。 注:使用SQL連接,這似乎是一個乾淨的例子,這裏的主要好處是嘲諷/單元測試用IoC代替以下代碼(Castle Windsor)
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概念時引發我們的問題。我最喜歡的方法將會如下修改方法,任何人都可以突出顯示它的潛在問題?
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();
}
}
}
}
使用var cmd = con.CreateCommand()代替新的SqlCommand(str,cn) – jgauffin 2010-09-10 11:32:42
@ M4N,謝謝用「var」更新。 @JQauffin:好主意,現在讓代碼示例保持不變我會按照「原樣」離開,但會從我提議的IDatabase接口的任何實現者中刪除責任。 – 2010-09-10 11:37:29