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

相關問題