Ninject.Web(webforms扩展),注入webform页面之外?

时间:2010-10-11 15:50:12

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

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

3 个答案:

答案 0 :(得分:2)

您不必使用服务定位器模式,只需在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/

答案 1 :(得分:1)

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

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

KernelContainer.Inject( this )

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

你需要确保只发生一次 - 小心这样做Global,这可能会多次实例化。

此外,您的申请/ Global课程需要来自NinjectHttpAppplication,但我确信您已完成此课程。

答案 2 :(得分:0)

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