If I had the code below, what are the best practice / design recommendations for replacing it with IoC (we want to use Castle Windsor). Since the using statement is responsible for creating the connection object, you cannot enter it directly into the constructor or method. Note. Using an SQL join as an apparently pure example, the main advantage here is mocking / unit testing.
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(); } } } }
I believe that there would be at least a few options, but since we are just starting out with IoC, I'm not sure that they will not cause us problems later and / or fly in front of IoC concepts. My approved approach will over-modify the approach as follows: can anyone highlight potential problems with it?
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(); } } } }
source share