2014-09-04 85 views
12

我打算使用Ninject作爲IoC容器,但無法理解如何在構造函數中創建具有多個1參數的類的實例。基本上,我有一個PCL庫認證服務接口及其在構造函​​數接收cosumer鍵,祕密和baseAddress一個WP8項目實施:具有Ninject多參數的構造函數

//On PCL project 
public interface IAuthorizationService { 
bool Authenticate(); 
} 

//On WP8 Project 
pubilc class MyAuthenticator : IAuthorizationService { 
public MyAuthenticator(string consumerKey, string consumerSecret, string baseAddress) { ... } 
public bool Authenticate() { ... } 
} 

現在我需要配置Ninject模塊,所以我可以IAuthorizationService的一個實例。 如果我的班有沒有構造我會做:

internal class Module : NinjectModule { 
public override void Load() { 
    this.Bind<IAuthorizationService>().To<MyAuthenticator>(); 
} 
} 

如果它的構造固定值,我會做:

internal class Module : NinjectModule { 
public override void Load() { 
    this.Bind<IAuthorizationService>().To<MyAuthenticator>().WithConstructorArgument(*/* fixed argument here*/*); 
} 
} 

並獲得一個實例Module.Get<IAuthorizationService>()

但什麼如果在編譯時無法解析構造函數參數?如何傳遞參數?綁定代碼應該如何?

編輯爲隱藏問題。

+0

爲什麼downvote?應該至少有評論,所以我可以改變這個問題...... – 2014-09-04 14:25:47

+0

這可能是因爲他們覺得這個問題很容易通過查看文檔來回答:https://github.com/ninject/ninject/wiki/Dependency-Injection- With-Ninject – BatteryBackupUnit 2014-09-06 13:34:20

+0

不,它不是!如果你看看文檔,所有的構造參數也是「可注入的」。我的構造函數有字符串參數。 – 2014-09-08 13:17:05

回答

10

這很容易。不管有多少構造函數的參數,結合保持不變:

Bind<IAuthorizationService>().To<MyAuthenticator>(); 

假設MyAuthenticator有一個構造函數IFoo類型的一個參數。 你所要做的就是告訴ninject如何解決/創建一個IFoo。再次,很簡單:

Bind<IFoo>().To<Foo>(); 

你不需要WithConstructorArgument以往,除了的情況下,要覆蓋ninject的默認行爲。比方說MyAuthenticator有一個IFoo類型的參數加上你想要特別配置的另一個參數string seed。所有你需要的是:

Bind<IFoo>().To<Foo>(); 
Bind<IAuthorizationService>().To<MyAuthenticator>() 
    .WithConstructorArgument("seed", "initialSeedValue"); 

無需指定IFoo參數的值!

+1

這就是問題所在,我的構造函數有字符串參數,我不知道它們在綁定時的值。 – 2014-09-08 13:18:04

+0

你從哪裏得到字符串參數的值?我想你可能需要一個工廠。爲什麼不將這些字符串參數作爲參數傳遞給'Authenticate()'方法? – BatteryBackupUnit 2014-09-08 14:08:37

+0

然後2是來自配置文件,所以我通過'WithConstructorArgument()'方法。另一個取決於用戶輸入。 – 2014-09-09 12:32:30