是内核单例,我可以在需要时创建它

时间:2013-02-20 20:49:00

标签: c# ninject

我第一次尝试使用Ninject,我不知道如何使用它。 让我们说我没有使用注入(构造函数或方法),我可以自由地做;

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

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

1 个答案:

答案 0 :(得分: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。