【问题标题】:How to inject a changing dependency如何注入不断变化的依赖项
【发布时间】:2008-11-08 12:52:41
【问题描述】:

我是依赖注入的新手,我想知道您将如何处理以下情况。我们有如下内容:

public class DatabaseContext
{
  public string ConnectionString {get;}
}

public interface IDataAccess
{
  string GetString(int id);
}

public class DataAccessImpl : IDataAccess
{
  private DatabaseContext _context;
  public DataAccessImpl(DatabaseContext context)
  {
    this._context=context;
  }

  public string GetString(int id)
  {
    return "some data";
  }
}

对于 Web 应用程序,每个请求都可以构建不同的 DatabaseContext 以指向不同的数据库。对于 windows 窗体,我们可以更改当前的 DatabaseContext。 di 框架如何处理可以更改的依赖项?这样,当我请求 IDataAccess 时,它始终具有适当/当前的 DatabaseContext。

【问题讨论】:

  • 顺便说一句:IMO,IDataAccess 是一个糟糕的接口名称。尝试使用描述其行为的名称。
  • 当然,这只是一个例子。

标签: c# dependency-injection ioc-container


【解决方案1】:

我采用的方法不是注入 DataContext,而是注入 DataContext 工厂,这是一个具有返回适当类型的 DataContext 方法的类。我有两个构造函数,在我的例子中,一个控制器类是默认构造函数,另一个是使用工厂(和其他注入对象)。默认构造函数只是简单地调用带有参数的构造函数,所有参数都为空。如果对应的参数为 null,则参数化构造函数会创建默认类型的对象。

使用工厂允许我的控制器操作在调用时创建一个新的 DataContext,而不是在应用程序的整个生命周期中都存在一个 DataContext。可以构建工厂以返回现有上下文(如果可用)并根据需要创建新上下文,但我更喜欢将它们限定为工作单元。

附:工厂实际上生成了一个围绕 DataContext 的包装类,而不是实际的 DataContext,作为接口 (IDataContextWrapper)。这使得从我的控制器测试中模拟实际数据库变得更加容易。以上所有内容均假设 LINQ/ASP.NET MVC,但我认为这些原则普遍适用。

【讨论】:

    猜你喜欢
    • 2013-09-02
    • 2011-11-22
    • 2017-08-06
    • 1970-01-01
    • 2021-07-07
    • 2022-01-24
    • 2020-12-20
    • 2020-03-14
    • 1970-01-01
    相关资源
    最近更新 更多