2008-11-08 23 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,但我認爲這些原則通常適用。