2013-02-20 73 views
1

我想第一次使用Ninject,并且我不确定如何使用它。 可以说我不使用注射(构造函数或方法),我可以自由地做什么;是内核单例,我可以在需要时创建它

var kernel = new StandardKernel(); 
var types = kernel.GetBindings(typeof(IDomainEventHandler<T>)) 
.GetImplementingTypes(); 

或者是否有访问内核的特定方式?当我创建一个新的内核时new StandardKernel(),还是仅仅是一个包装类?

回答

1

当你调用new StandardKernel()它始终会的StandardKernel一个新的实例。如果它是单身人士,构造函数将不会被暴露。

如果你想使用Ninject作为服务定位器(无关紧要,我不建议这样做),你必须将该实例传递给相关的代码。或者简单地将其公开为某些public static属性,并在例如在应用程序启动。

随着Microsoft.Practices.ServiceLocation.ServiceLocator你也可以使用这种方式:

注册

IKernel kernel = new StandardKernel(); 
IServiceLocator ninjectServiceLocator = new NinjectServiceLocator(kernel); 
Microsoft.Practices.ServiceLocation.ServiceLocator.SetLocatorProvider(() => ninjectServiceLocator); 

使用

var service = ServiceLocator.Current.GetInstance<IMyService>(); 

或者在ASP Web应用程序可以存取权限它想:

var kernel = ((NinjectHttpApplication) HttpContext.ApplicationInstance).Kernel; 
var service = kernel.Get<IService>(); 

但正如我所说。这些方法并不是一般性推荐的。 Ninject不打算以这种方式使用。你最好用构造函数注入来尝试DI。

+0

这就是我想实现只用接口定义域事件的情景,我已经用事先思考这样做。那么,这是可能与一个构造函数(最好的方法)注入?而且,我也不想将接口绑定到具体的类,而宁愿使用DI工具包来扫描我的程序集以获得实现类。 – hazimdikenli 2013-02-22 09:12:54

相关问题