【问题标题】:How to get instance from Ninject如何从 Ninject 获取实例
【发布时间】:2012-10-04 13:58:20
【问题描述】:

下面是 NinjectHttpApplication 配置..

public class MvcApplication : NinjectHttpApplication
{
        public MvcApplication()
        {
            Error += NinjectWebsiteApplication_Error;
        }
}    

protected override IKernel CreateKernel()
{
        var kernel = new StandardKernel();
        kernel.Load<ApplicationConfig>();
        return kernel;
}

void NinjectWebsiteApplication_Error(object sender, System.EventArgs e)
{
        ILogger _iLogger = **//How to get instance of Applogger here from Ninject kernel..**
}

下面是ApplicationConfig类...

public class ApplicationConfig : NHibernateNinjectModule
{

    public ApplicationConfig()
    {
     //other settings such as ddl script generation is present here
    }
    public override void Load()
    {                
        base.Load();
        Bind<ILogger>().To<AppLogger>().InSingletonScope();
    }
}

【问题讨论】:

    标签: asp.net-mvc ninject


    【解决方案1】:
    void NinjectWebsiteApplication_Error(object sender, System.EventArgs e)
    {
         var kernel = CreateKernel();
         ILogger _iLogger = kernel.Get<ILogger>();
    }
    

    好的,看起来NinjectHttpApplication 将生成的内核对象存储在

    public IKernel Kernel
    {
        get { return _kernel; }
    }
    

    所以你可以将上面重写为

    void NinjectWebsiteApplication_Error(object sender, System.EventArgs e)
    {
         ILogger _iLogger = Kernel.Get<ILogger>();
    }
    

    【讨论】:

    • 感谢您的回复。我们是否需要再次创建内核才能访问实例。因为在 ApplicationConfig() 中,我们还有许多其他事情要做,例如为应用程序创建 ddl 脚本。因此,当引发错误事件时,会调用 CreateKernel() 并再次生成脚本。我意识到我在动作过滤器中也需要这个实例,并尝试在属性上使用“inject”属性,但它给出了对象引用错误。在这种情况下是否注入接口的属性或只读属性..
    • 我们如何访问 _kernel 变量。我需要这样的东西吗?...stackoverflow.com/questions/5031678/…
    • Nono,内核变量是公开的,所以你只需访问它。注意,你需要访问的变量是内核,而不是私有_kernel
    • 它说.. [已弃用] IKernel NinjectHttpApplication.Kernel Ninject.Web.Mvc.NinjectHttpApplication.Kernel 已过时:“不要使用 Ninject 作为服务定位器”
    • 我认为内核的静态变量工作正常。我还尝试了 (ILogger)DependencyResolver.Current.GetService(typeof(ILogger)),它可以工作。但我选择使用静态变量而不是依赖解析器。感谢您的洞察力 Archil :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多