我是依赖注入的新手,我想知道你将如何处理以下场景。我们有以下内容:
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。
答案 0 :(得分:1)
我采用的方法不是注入DataContext而是注入DataContext工厂,这是一个带有返回相应类型的DataContext的方法的类。在我的例子中,我有两个构造函数,一个是控制器类的默认构造函数,另一个是工厂(以及其他注入的对象)。默认构造函数只是使用带有所有参数null的参数调用构造函数。如果相应的参数为null,则参数化构造函数将创建默认类型的对象。
使用工厂允许我的控制器操作在调用时创建新的DataContext,而不是在应用程序的整个生命周期中存在单个DataContext。可以构建工厂以返回现有的上下文(如果可用)并根据需要创建新的上下文,但我更喜欢将它们放在一个工作单元中。
P.S。工厂实际上围绕DataContext而不是实际的DataContext生成一个包装类作为接口(IDataContextWrapper)。这使得从控制器测试中模拟实际数据库变得更加容易。以上所有都假定LINQ / ASP.NET MVC,但我认为这些原则通常适用。