1

我有一個重載構造函數的服務類。一個構造函數有5個參數,而另一個具有4使用IoC.Resolve時,可以使用條件構建類嗎?

我打電話之前,

var service = IoC.Resolve<IService>(); 

我想要做一個測試,並在此基礎上測試的結果,使用特定的構造解析服務。換句話說,

 bool testPassed = CheckCertainConditions(); 
     if (testPassed) 
     { 
      //Resolve service using 5 paramater constructor 
     } 
     else 
     { 
      //Resolve service using 4 parameter constructor 
      //If I use 5 parameter constructor under these conditions I will have epic fail. 
     } 

有沒有一種方法可以指定我想使用哪一個?

+1

它可以用'DynamicParameters',但在你嘗試使用它之前 - 爲什麼你首先需要它?這聽起來像代碼中的設計缺陷比其他任何東西都... – 2010-04-08 20:14:19

回答

0

我的根本問題是,我試圖解決我的類有以下特徵:

public DatabaseSchemaSynchronisationService(IDatabaseService databaseService, IUserSessionManager userSessionManager) 

這基本上是對我沒用,因爲我usersessionmanager沒有積極NHibernate.ISession因爲我的數據庫的連接尚未制定。我試圖做的是檢查我是否有連接,然後解決這個作爲服務運行數據庫更新腳本的類。

當改變了我的整個類以不同的方式執行腳本,所有我需要在它的構造函數的簽名是:

public DatabaseSchemaSynchronisationService(ISessionFactory sessionFactory) 

這讓我打開我自己的會話。但是我必須在嘗試解析類之前首先檢查連接是否已準備好,但要將IDatabaseSchemaSynchronisationService作爲另一個類的構造函數的參數;這個類也gettting解決的地方,我無法檢查數據庫連接是一個壞主意。

而是在這第二類,我把IDatabaseSchemaSynchronisationService paramater出構造簽名,並使其局部變量只被實例化(解決):

if (connectionIsReady) 

謝謝大家誰回答。

2

在一般情況下,你應該提防構造歧義當談到DI,因爲你基本上是說給任何調用方「我真的不關心或者如果你使用一個其他的」。這不可能是你想要的。

然而,一個container-agnostic解決方案是包裝條件實施到實現相同接口的另一個類:

public class ConditionalService : IService 
{ 
    private readonly IService service; 

    public ConditionalService() 
    { 
     bool testPassed = CheckCertainConditions();  
     if (testPassed)  
     {  
      // assign this.service using 5 paramater constructor  
     }  
     else  
     {  
      // assign this.service using 4 parameter constructor 
     } 
    } 

    // assuming that IService has a Foo method: 
    public IBaz Foo(IBar bar) 
    { 
     return this.service.Foo(bar); 
    } 
} 

如果您不能執行構造函數中的CheckCertainConditions檢查,你可以使用懶評價代替

讓ConditionalService通過構造函數注入請求所有依賴項是一個好主意,但是我將其從示例代碼中刪除了。

您可以使用DI容器註冊ConditionalService,而不是真正的實現。

相關問題