我一直在使用Ninject.Web扩展将业务对象、存储库、实体框架上下文等注入到我的应用程序中。使用Inject属性可以很好地工作,该属性可以应用于继承自PageBase的webform中。我现在遇到了一个障碍,因为我试图编写一个自定义的成员资格提供程序,它需要在它内部完成注入,但这个提供程序当然不是从webform中实例化的。窗体身份验证将在对象需要时实例化该对象。如果不能访问Inject属性,我不知道该怎么做。我知道在某个地方有一个应用程序级内核,但我不知道如何利用它。任何建议都将不胜感激。
发布于 2010-10-12 06:47:28
您在实例上执行IKernel.Inject。在您正在使用的扩展项目中查看Application类的源代码。
在V2的情况下,it's in a KernelContainer。所以你需要做一个:
KernelContainer.Inject( this )其中this是您所说的非页面、非应用程序类。
您需要确保这种情况只发生一次-在Global中要小心这样做,它可能会被实例化多次。
此外,您的应用程序/ Global类需要从NinjectHttpAppplication派生,但我相信您已经介绍了这一点。
发布于 2011-06-24 08:13:24
您不必使用服务定位器模式,只需将其注入到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/
发布于 2010-10-12 04:49:56
您可能需要使用Service Locator模式,因为您无法控制成员资格提供程序的创建。
https://stackoverflow.com/questions/3907797
复制相似问题