c# - 用 IoC (CaSTLe Windsor) 替换以下代码

标签 c# castle-windsor ioc-container

如果我有下面的代码,用 IoC 替换它的最佳实践/设计注意事项是什么(我们希望使用 CaSTLe Windsor)。由于“using”语句负责创建连接对象,因此您不能将其直接注入(inject)到构造函数或方法中。 注意:使用 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 以便注入(inject)它(如果您使用基于属性的注入(inject),则使用属性)。用 IDbConnection 和 IDbCommand 替换代码中的 SqlConnection 和 SqlCommand。

更新

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

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

相关文章:

c# - 检测所有子进程是否关闭

c# - 如何使用 MDbg 以编程方式枚举正在运行的 .NET 进程中的类型?

.net - 温莎城堡 : Registering all implementations of an interface having the same constructor parameter

visual-studio - 企业应用程序中的 Ioc 容器放置

asp.net-mvc-2 - 如何为 ASP.NET MVC2 母版页提供独立于 Controller 的模型

c# - 如何在我的服务中获取 IHostApplicationLifetime 并将其注入(inject)容器(控制台应用程序)

c# - 使用 AutoMapper 映射 ViewModel/partials

c# - 如何在 IList 上使用 Reverse(Array, Int32, Int32) 或 List<T>::Reverse Method (Int32, Int32) ?

c# - CaSTLe Windsor - 值(value)注入(inject)

caSTLe-windsor - 温莎城堡 : Can I get all instances of a type?