2008-11-08 18 views
1

我是新来的依赖注入,我想知道你将如何处理以下情况。我们有类似如下:如何注入变化的依赖关系

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

顺便说一句:IMO,IDataAccess是一个可怕的接口名称。尝试使用可以描述其行为的名称。 – 2008-11-08 12:58:42

回答

1

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

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

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