【问题标题】:Ninject.Web (webforms extension), injecting outside of a webform page?Ninject.Web(网络表单扩展),在网络表单页面之外注入?
【发布时间】:2010-10-11 15:50:12
【问题描述】:

我一直在使用 Ninject.Web 扩展将业务对象、存储库、实体框架上下文等注入我的应用程序。使用可以在从 PageBase 继承的网络表单中应用的 [Inject] 属性非常有效。我现在遇到了一个障碍,因为我正在尝试编写一个需要在其中完成注入的自定义成员资格提供程序,但当然这个提供程序不是从网络表单中实例化的。 Forms Authentication 将在需要时实例化对象。我不确定如何在没有访问 [Inject] 属性的情况下执行此操作。我知道某处有一个应用程序级内核,但我不知道如何利用它。任何建议将不胜感激。

【问题讨论】:

  • 感谢您的建议。我刚刚完成了我之前的所有问题,并确保接受那些有答案的问题。

标签: asp.net inversion-of-control ninject ninject.web


【解决方案1】:

您不必使用服务定位器模式,只需在 Application_Start 中注入自定义成员资格提供程序的属性即可。假设您已经正确注册了提供程序,您可以通过以下方式执行此操作:

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

        // Inject account repository into our custom membership & role providers.
        _kernel.Inject(Membership.Provider);

        // Register the Object Id binder.
        ModelBinders.Binders.Add(typeof(ObjectId), new ObjectIdModelBinder()); 
    }

我在这里写了更深入的解释:

http://www.danharman.net/2011/06/23/asp-net-mvc-3-custom-membership-provider-with-repository-injection/

【讨论】:

    【解决方案2】:

    您在实例上执行IKernel.Inject。查看您正在使用的扩展项目中 Application 类的源代码。

    在 V2 的情况下,it's in a KernelContainer。所以你需要做一个:

    KernelContainer.Inject( this )
    

    其中this 是您所说的非页面、非应用程序类。

    您需要确保这只发生一次 - 请小心在 Global 中执行此操作,这可能会被实例化多次。

    另外,您的 Application / Global 类需要派生自 NinjectHttpAppplication,但我相信您已经涵盖了这一点。

    【讨论】:

      【解决方案3】:

      您可能需要使用Service Locator 模式,因为您无法控制成员资格提供程序的创建。

      【讨论】:

      • 此时我想远离真正的服务定位器。在这一点上,我认为 Ninject.Web 虽然不错,但并没有真正为我做这件事,因为我需要能够在 webforms 以及其他地方注入。此时我正在考虑通过单例实现静态实例。
      • -1: SL 模式仍然控制着创作——注入后或任何它被正确命名的东西就是想要的
      猜你喜欢
      • 2018-12-24
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-28
      • 1970-01-01
      • 2013-04-03
      • 2011-09-04
      相关资源
      最近更新 更多