2011-01-31 62 views
4

再一次,我想我可能会错过这里的明显。我正在寻找习惯做自动绑定。我一直在看Ninject.extension.conventions项目和程序集扫描器。基于Ninject约定的绑定

我所拥有的是看起来像下面的很多线路,我想自动绑定:

Bind<ICommandHandler<MyCommand>>().To<MyCommandHandler>(); 
Bind<ICommandHandler<MyOtherCommand>>().To<MyOtherCommandHander>(); 

我试过几个变化:

Kernal.Scan(x => { 
    x.FromAssemblyContaining<MyCommand>(); 
    x.WhereTypeInheritsFrom(typeof(ICommandHander<>)); 
    x.BindWith(new DefaultBindingGenerator()); 
}); 

但也有没有实例返回时:

kernel.Get<ICommandHandler<T>>(); 
+0

你试过kernel.Load(Assembly.GetExecutingAssembly());你需要把它放在CreateKernel覆盖 – WorldIsRound 2011-02-01 20:00:07

+0

我不知道我明白你的意思。我现在有一个NinjectModule.Load()方法中的Kernel.Scan代码。 – Mike 2011-02-02 23:12:30

回答

4

试试看GenericBindingGenerator而不是DefaultBindingGenerator

0

解决办法:

Kernel.Scan(x => { 
    x.FromAssemblyContaining<CoreModule>(); 
    x.BindingGenerators.Add(new GenericBindingGenerator(typeof(IHandleQuery<,>))); 
     x.InSingletonScope(); 
}); 
1
// use Ninject.Extensions.Conventions for convention-based binding 
kernel.Scan(scanner => 
    { 
     // look for types in this assembly 
     scanner.FromCallingAssembly(); 

     // make ISomeType bind to SomeType by default (remove the 'I'!) 
     scanner.BindWith<DefaultBindingGenerator>(); 
    });