2011-04-12 97 views
4

目前我正在嘗試設置依賴注入並覆蓋授權屬性。儘管我總是看到錯誤,但我試圖遵循一些例子。ASP.NET MVC3 IAuthorisationfilter Ninject依賴關係

的Global.asax

public class MvcApplication : Ninject.Web.Mvc.NinjectHttpApplication 
{ 
    private class MyModule : NinjectModule 
    { 
     public override void Load() 
     { 
      this.BindFilter<SageAdminAuthorizationFilter>(FilterScope.Controller, 0); 
      Bind<IAuthentication>().To<CustomAuthenticationService>(); 
     } 
    } 

    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 
    } 

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

     routes.MapRoute(
      "Default", 
      "{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
    } 

    protected override void OnApplicationStarted() 
    { 
     AreaRegistration.RegisterAllAreas(); 

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

    protected override IKernel CreateKernel() 
    { 
     var modules = new INinjectModule[] { 
     new MyModule() 
    }; 
     var kernel = new StandardKernel(modules); 

     return kernel; 
    } 
} 

身份驗證篩選

public class CustomAuthenticationService : IAuthentication 
{ 
    public void SignIn(string claimedIdentifier, bool createPersistentCookie) 
    { 
     //Write Sign in code here 
     FormsAuthentication.SetAuthCookie(claimedIdentifier, createPersistentCookie); 
    } 

    public void SignOut() 
    { 
     FormsAuthentication.SignOut(); 
    } 

    public bool Authorize(HttpContextBase httpContext) 
    { 
     //Check here if the user can administer the admin 
     return false; 
    } 
} 

//The Authorization attribute on a controller 
public class CustomAdminAuthorizationFilter : IAuthorizationFilter 
{ 
    private readonly IAuthentication _authentication; 

    public SageAdminAuthorizationFilter(IAuthentication authentication) 
    { 
     _authentication = authentication; 
    } 

    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     _authentication.Authorize(filterContext.HttpContext); 
    } 
} 

我總是收到

序列不包含任何元素。

任何幫助將不勝感激。

更新: 我仍然收到相同的錯誤。

調用棧是如下

用於定位源 'C:\項目\ Ninject \ ninject.web.mvc \ MVC3 \ SRC \ Ninject.Web.Mvc \ NinjectHttpApplication.cs'。校驗和:MD5 {3d e3 7f 86 44 70 db 0 3c 6f e0 97 fb 1e 12 13} 文件'c:\ Projects \ Ninject \ ninject.web.mvc \ mvc3 \ src \ Ninject.Web.Mvc \ NinjectHttpApplication。 cs'不存在。 在'c:\ Projects \ Ninject \ ninject.web.mvc \ mvc3 \ src \ Ninject.Web.Mvc \ NinjectHttpApplication.cs'的腳本文件中尋找...... 尋找'c:\ Projects \ Ninject \ ninject.web.mvc \ MVC3的\ src \ Ninject.Web.Mvc \ NinjectHttpApplication.cs'。 該文件在項目中找不到。 (x86)\ Microsoft Visual Studio 10.0 \ VC \ crt \ src \'... 查看目錄'C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ atlmfc \ src \ mfc \'... 在目錄'C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ atlmfc \ src \ atl \'中查找... 查看目錄'C:\ Program文件(x86)\ Microsoft Visual Studio 10.0 \ VC \ atlmfc \ include \'... 活動解決方案的調試源文件設置指示調試器不會要求用戶查找該文件:c:\ Projects \ Ninject \ ninject.web.mvc \ MVC3的\ src \ Ninject.Web.Mvc \ NinjectHttpApplication.cs。 調試器找不到源文件'c:\ Projects \ Ninject \ ninject.web.mvc \ mvc3 \ src \ Ninject.Web.Mvc \ NinjectHttpApplication.cs'。

我已經從Nuget安裝Ninject和Ninject.MVC3。它看起來雖然它試圖找到要調試的文件。任何人都可以告訴我爲什麼會發生這種情況。

我也收到此錯誤

[InvalidOperationException異常:序列不包含任何元素] System.Linq.Enumerable.Single(IEnumerable的1 source) +320 Ninject.Web.Mvc.Bootstrapper.Initialize(Func 1 createKernelCallback)在C:\項目\ Ninject \ ninject.web.mvc \ MVC3 \ src \ Ninject.Web.Mvc \ Bootstrapper.cs:67 Ninject.Web.Mvc.NinjectHttpApplication.Application_Start()in c:\ Projects \ Ninject \ ninject.web.mvc \ mvc3 \ src \ Ninject.Web.Mvc \ NinjectHttpApplication.cs:65

+0

對不起的關係是不解析器是紅鯡魚。這是留下來試圖追隨其他人的例子。 – 2011-04-12 12:54:21

回答

2

應使用以下語法註冊動作過濾器:

public override void Load() 
{ 
    BindFilter<CustomAdminAuthorizationFilter>(FilterScope.Controller, 0); 
    Bind<IAuthentication>().To<CustomAuthenticationService>(); 
} 

您還可以apply the filter conditionally

備註:無法看到您在問題中顯示的NinjectDependencyResolver類的任何關係。這已經內置到ninject.mvc3中,您不應該手動編寫它。

+0

嗨達林,非常感謝你看起來應該工作,雖然我收到了同樣的錯誤。我會做一些測試,調用堆棧正在嘗試尋找ninject源代碼。我會繼續調查並確認這是否解決了我的問題。 – 2011-04-12 13:01:07