2014-01-27 28 views
2
構造器

使用Ninject 3.0,我知道我可以在解決時間從而將參數傳遞給具體的服務的構造:通行證位置參數在Ninject

IKernel kernel = new StandardKernel(); 
kernel.Bind<IService>.To<ConcreteService>(); 
MySettings mySettings = new DefaultConcreteServiceSettings(); 

IService service = kernel.Get<IService>(new[] { new ConstructorArgument("settings", mySettings) }); 

ConstructorArgument對象需要兩個參數 - 第一個是名稱重寫的參數,第二個是它的注入值。

是否有可能基於其在構造函​​數中的足跡,而不是正式的參數名稱位置注入mySettingsIService的構造?

編輯

每@ nemesv的要求下,我加入了一些示例代碼ConcreteService。我的動機是基於一種觀念,根據參數名稱爲每一個具體的實施IService,使代碼脆弱:

public class ConcreteService : IService 
{ 
    readonly ISettings _settings; 

    public ConcreteService(ISettings settings) 
    { 
     _settings = settings; 
    } 
} 

public class ConcreteServiceBySomePoorGuyWhoCantSpell : IService 
{ 
    readonly ISettings _settings; 

    public ConcreteServiceBySomePoorGuyWhoCantSpell(ISettings suttingz) 
    { 
     _settings = suttingz; 
    } 
} 
+0

您可以發佈示例'ConcreteService'嗎?你使用參數名稱的問題是什麼?你爲什麼想要根據職位進行綁定? – nemesv

+0

爲什麼不在容器中註冊你的'ISettings'。所以Ninject會自動爲你解決它:'kernel.Bind ().ToConstant(mySettings); IService service = kernel.Get ()});'如果你不想在每個Iservice中使用這個mysetting可以使用'WhenInjectedInto'配置選項來限制注入默認設置的位置 – nemesv

+0

@memesv - 我最終做了一些近似於您的建議。爲了完成,是否有可能在解析時使用位置參數注入? – bavaza

回答

1

不行,你就必須使用綁定作爲ToProvider來解決這個問題,抽象工廠或使用位置參數的過載組合的上下文綁定,例如:

Bind<IService>().To<MyService>().WithConstructorArgument(...).Named(...) 
Bind<IService>().To<MyService>().WithConstructorArgument(...).WhenInjectedInto(...)