2016-05-02 47 views
0

我在ASP.NET核心(此時爲RC1)的C#中構建了一個數據服務。其目的是獲取不同類型的數據請求的集合並返回數據存儲庫對象。然後將該對象轉換爲JSON併發送到請求頁面。IEnumerable的依賴注入<IObjects>由ASP.NET核心中的配置定義

數據來源分爲幾個類別,在每個類別中,有不同速度和可靠性數據的來源。

我的方法一直遵循SOLID原則,我知道如何(仍在學習),並使用依賴注入來創建解析請求並返回合併數據所需的對象層次結構。

其中一個具體目標是能夠在配置中定義(此時appsettings.json)將要注入到每個圖層中的數據路由對象和數據適配器對象的集合。數據源可以定期更改,添加新的源代碼,我也希望有一個允許模擬測試的系統。

我已經通過創建接口,IDataRouter和IDataAdapter在所有情況下均勻工作來完成此操作。

我目前面臨的挑戰是使用ASP.NET Core Dependency Injection系統(或合適的替代品)基於我的配置文件中引用的具體實現來創建IDataRouter和IDataAdapter的枚舉。然後這些將被注入到更高級別的類中並用於收集請求的數據。

這裏是一般細目;

DataService有一個:許多IDataRouter實例作爲IEnumerable。 IRequests對象(是一個IEnumerable)被帶入並且每個IRequest被髮送到適當的IDataRouter進行進一步處理。

每個IDataRouter都有一個:IDataAdapter的許多實例作爲IEnumerable。每個IDataAdapter都能夠處理特定類型的IRequest。

請求從DataService向下移至DataRouters,然後向下移至DataAdapter,在該位置數據來源。然後數據通過鏈迴流並在DataService級別整合到一個存儲庫中,然後轉換爲JSON併發送給請求者。

我的具體問題是如何使用ASP.NET核心DI系統構建IEnumerable並將IEnumerable枚舉傳遞給DataService和DataRouters。它們都需要包含我在配置文件中指定的具體實現列表。

這裏是當前的DataService構造函數;

public DataService(IRequests requests, IEnumerable<IDataRouters> routers) 
{ 
_requests = requests; 
_routers = routers; 
} 

這可能會轉換爲;

public class DataServiceOptions : IDataServiceOptions 
{ 
    public IRequests requests { get; set; } 
    public IEnumerable<IDataRouters> routers { get; set; } 
} 

public DataService(IOptions<IDataServiceOptions> optionsAccessor) 
{ 
    _requests = optionsAccessor.value.requests; 
    _routers = optionsAccessor.value.routers; 
} 

爲了將IEnumerable傳遞給IDataRouters,需要實現一個非常類似的結構。每個IDataRouter都需要不同的特定具體IDataAdapter集合。所有這些都需要在可編輯的配置源(文件)中指定。

+0

你能提供配置文件結構嗎? – MaKCbIMKo

+0

我正在使用標準的appsettings.json文件進行配置。我可以輕鬆創建支持此設置所需的配置設置,包括設置鍵下的枚舉數據。問題是在ASP.NET DI系統中正確構建和關聯對象。 一個很好的例子是http://docs.asp.net/en/latest/fundamentals/configuration.html – drobertson

+0

MaKCbIMKo我可以爲你創建一些模擬設置,如果它會幫助,但在這一點上,我只是計劃創建設置以支持我需要在ASP.NET核心DI系統中執行的操作。 這些設置主要是DataRouter具體實現的名稱,其中應包含一個DataAdapter列表。每個設置還會包含少量的實例特定數據,例如用於連接的端點和用戶ID。 – drobertson

回答

0

也許我誤解了。你不能用工廠做這件事嗎?

創建一個工廠類:

public class DataRoutersFactory : IDataRoutersFactory 
{ 

     private readonly IConfiguration _config; 

     public DataRoutersFactory(IConfiguration config) 
     { 
      _config = config; 
     } 

     public IEnumberable<IDataRouters> CreateDataRouters() 
     { 
      // TODO:- use whatever logic here to read _config and build the data routers to return. 
     } 

} 

然後在你的服務,而不是注入IEnumerable<IDataRouters>,注入IDataRoutersFactory代替,並用它來獲取路由器。

對於單元測試,你可以模擬IDataRoutersFactory在測試時返回你想要的任何路由器。

相關問題