【问题标题】:Why Won't Ninject New Up Objects In A Class为什么不在类中注入新对象
【发布时间】:2015-01-13 18:11:06
【问题描述】:
My Setup:
Visual Studio 2013
Web Forms/MVC project
C#
Ninject 3.2.0.0
Entity Framework

我有一个使用 Ninject 作为其 IoC 容器的 Web 表单/MVC 混合项目。直到今天,我对 Ninject 没有任何问题。我遇到的问题是,每当我使用类时,我都无法让 Ninject 新建一些对象。这是一些有效的代码:

// Master1.master
namespace TestCode
{
    public partial class Master1 : MasterPage
    {
        [Inject]
        public FooController Foo { get; set; }

        protected void Page_Load(object sender, EventArgs e)
        {
            // Do some setup logic.
            Foo.Bar();
        }
    }
}

下面是一些不能使用类的代码:

// Master1.master
namespace TestCode
{
    public partial class Master1 : MasterPage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            new Wrapper().SomeMethod();
        }
    }
}

// Wrapper.cs
namespace TestCode
{
    public class Wrapper
    {
        [Inject]
        public FooController Foo { get; set; }

        public void SomeMethod()
        {
            // Do some setup logic.
            Foo.Bar();
        }
    }
}

我的问题是当我执行 SomeMethod() 时,Foo 为空。为什么会这样,我该怎么做才能让 Ninject 成为新的 Foo?

【问题讨论】:

  • 很确定你需要使用 Ninject 来给你你的对象。只是调用new 不会进行任何注入,因为 Ninject 从未运行过,也没有任何东西告诉 Ninject 运行和注入。
  • 您需要从 ninject 内核中获取 Wrapper 类,而不是新建它。关键字new 很好地表明您已经偏离了DI 路径。 Ninject 不会神奇地覆盖 new 关键字。

标签: c# asp.net asp.net-mvc inversion-of-control ninject


【解决方案1】:

好的 - 我现在开始工作了。谢谢大家!我需要像这样添加一个绑定我的 NinjectWebCommon 类:

public static class NinjectWebCommon 
{
    private static readonly Bootstrapper Bootstrapper = new Bootstrapper();

    public static void Start() 
    {
        DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
        DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
        Bootstrapper.Initialize(CreateKernel);
    }

    public static void Stop()
    {
        Bootstrapper.ShutDown();
    }

    private static IKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
        kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();


        // Needed to add this binding.
        kernel.Bind<IWraper>().To<Wraper>().InRequestScope();


        RegisterServices(kernel);
        GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);

        return kernel;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 2012-07-31
    相关资源
    最近更新 更多