【问题标题】:Injection question when using Ninject 2 in ASP.NET MVC application在 ASP.NET MVC 应用程序中使用 Ninject 2 时的注入问题
【发布时间】:2009-12-18 22:54:08
【问题描述】:

我将 Ninject 2 与 ASP.NET MVC Web 应用程序一起使用。所有依赖项都在堆栈中正确处理(Controllers->Services->Repositories)。但是,我在服务项目中有一些不在那个“链”中的类,我也想在应用程序启动时注入这些类。如何让 Ninject 识别它们?我有带有[Inject] 属性的公共属性,但是当应用程序运行时,它们为空。我错过了什么?

这是我的 MvcApplication 类:

public class MvcApplication : NinjectHttpApplication
{
    protected override void OnApplicationStarted() {
        RegisterRoutes(RouteTable.Routes);
        RegisterAllControllersIn(Assembly.GetExecutingAssembly());
    }

    protected override IKernel CreateKernel() {
        var modules = new INinjectModule[] {
            new Services.ServiceModule(),
            new Data.DataModule()
        };

        var kernel = new StandardKernel(modules);

        return kernel;
    }

    // route registration removed
}

我仔细检查了两个模块以确保存在正确的绑定。

来自模块的示例:

public class ServiceModule : NinjectModule
{
    public override void Load() {
        Bind<IAccountService>().To<AccountService>();
        ....
    }
}

【问题讨论】:

    标签: asp.net-mvc ninject


    【解决方案1】:

    为了让 Ninject 注入依赖项,您必须使用内核创建对象。这对于自然依赖链中的对象(即在您的应用程序中,Controllers->Services->Repositories)来说很容易,但对于它之外的对象来说可能会很棘手。

    您必须添加附加类型作为在自然链中创建的类型之一的依赖项,或者以某种方式获取内核挂钩并调用 Get。为此,您可能必须使用静态服务定位器。

    【讨论】:

      【解决方案2】:

      您是否要覆盖 CreateKernel()?您需要这样做并在那里进行绑定。

      【讨论】:

      • 那里一切都很好。你能在你的一个模块中发布一些代码吗?
      • 哇...这一切对我来说都很好。您可能希望将其发布到 Google 群组。 Ian Davis 和 Nate Kohari 的反应快得离谱。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多