1

在实现Roleprovider的同时,它从数据库中获取角色。我一直得到一个对象没有...异常的实例。如何将一个Ninjects服务注入到一个自制的RoleProvider类中?

事实证明,ninject不会注入我的服务。

我试着把attribuut放在属性顶部没有成功。 我尝试添加一个构造函数,但随后即时得到的死亡黄屏告诉我应该有一个无参数的构造函数

代码

Public Class AnipRolProvider 
    Inherits RoleProvider 
'this service needs to get initialized 
    Private _memberhip As IMemberschipService 

    Sub New() 
     'only this constructor is called by asp by default 
    End Sub 

    Sub New(memberschipservice As IMemberschipService) 
     'this constructor should be called but how ? 
     _memberhip = memberschipservice 
    End Sub 

的唯一方法,我需要

Public Overrides Function GetRolesForUser(username As String) As String() 
     If String.IsNullOrEmpty(username) Then 
      Throw New ArgumentException("username is nothing or empty.", "username") 
     End If 

     Return _memberhip.GetRolesForUser(username) 

    End Function 

怎么办我实施了ninjects,让角色提供者与忍者合作?

其他信息:

<roleManager enabled="true" defaultProvider="AnipRoleProvider"> 
     <providers> 
     <clear/> 
     <add name="AnipRoleProvider" type="Anip.Core.AnipRolProvider" /> 
     </providers> 
    </roleManager> 

在我的web.config有到aniproleprovider参考。

offtopic-sidenote:在复制这些snipsets时,我应该学会写更好的名字!

+0

你不应该有一个参数的构造函数,可以你把代码放在你使用AnipRolProvider的地方?我不明白你的黄色屏幕来自哪里,你在全球注册IMembershipService? – VinnyG 2011-04-10 18:23:56

+0

@VinnyG添加代码 – David 2011-04-10 18:30:44

+0

说明YSOD上的内容很有用。 另外,你能解释为什么你认为它应该注射吗?除非Ninject正在创建对象,否则只要将属性放在一起就没有任何作用。 (文档解释了这一点,只是重申,如果它不清楚) – 2011-04-10 22:37:50

回答

3

你必须注册在global.ascx你IMembershipService,不知道如何在VB做把在C#中,它看起来是这样的:

kernel.Bind<IMembershipService>().To<MembershipService>().InRequestScope(); 

using System; 
using System.Collections.Generic; 
using System.Security.Principal; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Routing; 
using System.Web.Security; 
using Domain.Interfaces; 
using Domain.Models; 
using Domain.Storage; 
using Domain.Services; 
using Ninject; 
using Ninject.Syntax; 
using WebApp.Controllers; 
using WebApp.Mailers; 
using WebApp.ModelBinders; 

namespace WebApp 
{ 

    public class MvcApplication : NinjectHttpApplication 
    { 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 
    } 

    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 

    } 

    protected override IKernel CreateKernel() 
    { 
     var kernel = new StandardKernel(); 
     kernel.Load(Assembly.GetExecutingAssembly()); 

     kernel.Bind<ISession>().To<MongoSession>().InRequestScope(); 
     kernel.Bind<IAuthenticationService>().To<AuthenticationService>().InRequestScope(); 
     kernel.Bind<IMailer>().To<Mailer>().InRequestScope(); 
     kernel.Bind<IFileProvider>().To<MongoFileProvider>().InRequestScope(); 

     return kernel; 
    } 

    protected override void OnApplicationStarted() 
    { 
     base.OnApplicationStarted(); 

     AreaRegistration.RegisterAllAreas(); 
     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 
    } 

} 
+0

你也可以采取在http://mvcstarter.codeplex.com/看看更多代码 – VinnyG 2011-04-10 18:52:48

+0

谢谢@Remo,did'nt知道,不知道我从哪里拿这段代码,但我编辑了我的答案,没关系,我怎么用它现在? – VinnyG 2011-04-11 02:10:02

+1

现在看起来不错。 – 2011-04-11 10:04:21

相关问题