2012-05-24 30 views
0

繼續從另一個問題,我有here我有MainConfig對象,我想注入該對象的某些屬性,而不是實際的MainConfig對象本身。從我的模塊Load方法摘錄:C#Ninject WithConstructorArgument導致ActivationException

Bind<IConfig>() 
    .ToMethod<IConfig>(ctx => MainConfig.Load()) 
    .InSingletonScope(); 

var config = Kernel.Get<IConfig>(); //this returns a fully-loaded IConfig, so I know this works 

Bind<IProcessingBuffer>() 
    .To<ProcessingBuffer>() 
    .InSingletonScope() 
    .WithConstructorArgument("processingInterval", 
          ctx => ctx.Kernel.Get<IConfig>().WinService.DataProcessingInterval); 

ProcessingBuffer的構造是:

public ProcessingBuffer(int processingInterval, IProcessingResults procResults) 

然而,當我嘗試啓動我的應用程序得到ActivationException,因爲processingInterval沒有被注入ProcessingBuffer。唯一的例外是:

Ninject.ActivationException was unhandled 
    Message=Error activating int 
No matching bindings are available, and the type is not self-bindable. 
Activation path: 
    5) Injection of dependency int into parameter processingInterval of constructor of type ProcessingBuffer 
    4) Injection of dependency ProcessingBuffer into parameter procBuffer of constructor of type MyCompanyDataService 
    3) Injection of dependency MyCompanyDataService into parameter instance of constructor of type NinjectServiceHost{MyCompanyDataService} 
    2) Injection of dependency NinjectServiceHost{MyCompanyDataService} into parameter dataHost of constructor of type MyCompanyWinService 
    1) Request for MyCompanyWinService 

Suggestions: 
    1) Ensure that you have defined a binding for int. 
    2) If the binding was defined in a module, ensure that the module has been loaded into the kernel. 
    3) Ensure you have not accidentally created more than one kernel. 
    4) If you are using constructor arguments, ensure that the parameter name matches the constructors parameter name. 
    5) If you are using automatic module loading, ensure the search path and filters are correct. 

    Source=Ninject 
    StackTrace: 
     at Ninject.KernelBase.Resolve(IRequest request) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 362 
     at Ninject.Planning.Targets.Target`1.GetValue(Type service, IContext parent) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Targets\Target.cs:line 197 
     at Ninject.Planning.Targets.Target`1.ResolveWithin(IContext parent) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Targets\Target.cs:line 165 
     at Ninject.Activation.Providers.StandardProvider.GetValue(IContext context, ITarget target) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 114 
     at Ninject.Activation.Providers.StandardProvider.<>c__DisplayClass4.<Create>b__2(ITarget target) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 96 
     at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
     at System.Linq.Buffer`1..ctor(IEnumerable`1 source) 
     at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) 
     at Ninject.Activation.Providers.StandardProvider.Create(IContext context) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 96 
     at Ninject.Activation.Context.Resolve() in c:\Projects\Ninject\ninject\src\Ninject\Activation\Context.cs:line 157 
     at Ninject.KernelBase.<>c__DisplayClass10.<Resolve>b__c(IBinding binding) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 386 
     at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
     at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source) 
     at Ninject.Planning.Targets.Target`1.GetValue(Type service, IContext parent) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Targets\Target.cs:line 197 
     at Ninject.Planning.Targets.Target`1.ResolveWithin(IContext parent) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Targets\Target.cs:line 165 
     at Ninject.Activation.Providers.StandardProvider.GetValue(IContext context, ITarget target) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 114 
     at Ninject.Activation.Providers.StandardProvider.<>c__DisplayClass4.<Create>b__2(ITarget target) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 96 
     at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
     at System.Linq.Buffer`1..ctor(IEnumerable`1 source) 
     at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) 
     at Ninject.Activation.Providers.StandardProvider.Create(IContext context) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 96 
     at Ninject.Activation.Context.Resolve() in c:\Projects\Ninject\ninject\src\Ninject\Activation\Context.cs:line 157 
     at Ninject.KernelBase.<>c__DisplayClass10.<Resolve>b__c(IBinding binding) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 386 
     at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
     at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source) 
     at Ninject.Planning.Targets.Target`1.GetValue(Type service, IContext parent) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Targets\Target.cs:line 197 
     at Ninject.Planning.Targets.Target`1.ResolveWithin(IContext parent) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Targets\Target.cs:line 165 
     at Ninject.Activation.Providers.StandardProvider.GetValue(IContext context, ITarget target) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 114 
     at Ninject.Activation.Providers.StandardProvider.<>c__DisplayClass4.<Create>b__2(ITarget target) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 96 
     at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
     at System.Linq.Buffer`1..ctor(IEnumerable`1 source) 
     at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) 
     at Ninject.Activation.Providers.StandardProvider.Create(IContext context) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 96 
     at Ninject.Activation.Context.Resolve() in c:\Projects\Ninject\ninject\src\Ninject\Activation\Context.cs:line 157 
     at Ninject.KernelBase.<>c__DisplayClass10.<Resolve>b__c(IBinding binding) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 386 
     at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
     at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source) 
     at Ninject.Planning.Targets.Target`1.GetValue(Type service, IContext parent) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Targets\Target.cs:line 197 
     at Ninject.Planning.Targets.Target`1.ResolveWithin(IContext parent) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Targets\Target.cs:line 165 
     at Ninject.Activation.Providers.StandardProvider.GetValue(IContext context, ITarget target) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 114 
     at Ninject.Activation.Providers.StandardProvider.<>c__DisplayClass4.<Create>b__2(ITarget target) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 96 
     at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
     at System.Linq.Buffer`1..ctor(IEnumerable`1 source) 
     at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) 
     at Ninject.Activation.Providers.StandardProvider.Create(IContext context) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 96 
     at Ninject.Activation.Context.Resolve() in c:\Projects\Ninject\ninject\src\Ninject\Activation\Context.cs:line 157 
     at Ninject.KernelBase.<>c__DisplayClass10.<Resolve>b__c(IBinding binding) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 386 
     at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
     at System.Linq.Enumerable.<CastIterator>d__b1`1.MoveNext() 
     at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source) 
     at Ninject.ResolutionExtensions.Get[T](IResolutionRoot root, IParameter[] parameters) in c:\Projects\Ninject\ninject\src\Ninject\Syntax\ResolutionExtensions.cs:line 37 
     at MyCompany.WinService.Program.Main(String[] args) in C:\Projects\MyProject\MyCompanyWinService\Program.cs:line 41 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 

有什麼辦法,我可以確認我的WithConstructorArgument拉姆達甚至被稱爲然後跟蹤它通過?我已經下載了Ninject源代碼,但是我無法確定在哪裏設置斷點來查找我的回調的使用位置。

該應用程序是使用Ninject 3.0和Ninject.Extensions.Wcf來承載WCF TCP服務的Windows服務。

編輯補充:如果我改變ProcessingBuffer構造方法來整IConfig對象,並刪除WithConstructorArgument通話則IConfig對象被成功注入,我可以訪問相應的屬性。但是,我想要移除注入整個IConfig對象以除去依賴關係,而僅傳遞所需的數據。

回答

3

您的MyCompanyDataService需要ProcessingBuffer而不是IProcessingBuffer的實例。因此您的綁定不適用。

+0

該死,簡單的錯字在我的構造函數中,缺少一個I.謝謝Remo!我會在將來對那個人保持警惕。 –

相關問題