Если бы у меня был приведенный ниже код, каковы наилучшие рекомендации / рекомендации по его замене на 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();
}
}
}
}