如果我有下面的代码,则用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();
           }
       }
    }
}

最佳答案

我使用了IoC,但没有使用Castle,尽管它们都很相似,所以这是我的重点。

我认为您的方向正确-尽管我可能使用单独的工厂进行连接和命令,或者实际上将连接打开和命令留给另一个类运行,所以存储库不必知道此详细信息。只需在类的构造函数中使用IDatabase即可将其注入(或在使用基于属性的注入时使用属性)。用IDbConnection和IDbCommand替换代码中的SqlConnection和SqlCommand。

更新

它们确实继承/实现IDisposable,因此您可以使用using语句。对不起,我错了。

关于c# - 用IoC替换以下代码(城堡温莎),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3684024/

10-13 03:12