【发布时间】:2010-09-10 10:58:05
【问题描述】:
如果我有下面的代码,用 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();
}
}
}
}
【问题讨论】:
-
使用 var cmd = con.CreateCommand() 而不是 new SqlCommand(str, cn)
-
@M4N,感谢更新了“var”。 @JQauffin:好主意,现在为了保持代码示例相同,我将“按原样”保留,但会从我提议的 IDatabase 接口的任何实现者那里移除责任。
标签: c# castle-windsor ioc-container