如何注入不断变化的依赖

时间:2008-11-08 12:52:41

标签: c# dependency-injection ioc-container

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

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。

1 个答案:

答案 0 :(得分:1)

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

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

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