2009-08-18 40 views
6

我是Windsor城堡,它對傳遞正在使用的存儲庫的控制器構造函數非常有用。如何將存儲庫傳遞給ASP.NET MVC中的authorize屬性

private IStoryRepository Repository; 
public StoryController(IStoryRepository Repository) 
{ 
    this.Repository = Repository;     
} 

現在我有一個操作是在管理區域顯示主管理菜單。我已經使用了自定義的授權屬性,這將只是檢查登錄的用戶是管理員(只是在用戶表中的isAdmin標誌)

[AdminAuthorize] 
public ActionResult Menu() 

private IStoryRepository Repository; 
/// <summary> 
/// Initializes a new instance of the <see cref="AdminAuthorizeAttribute"/> class. 
/// </summary> 
public AdminAuthorizeAttribute(IStoryRepository Repository) 
{ 
    this.Repository = Repository; 
} 

/// <summary> 
/// Checks if the user is authorised 
/// </summary> 
/// <param name="httpContext">The HTTP context.</param> 
/// <returns> 
/// <c>true</c> if authorized; otherwise, <c>false</c>. 
/// </returns> 
protected override bool AuthorizeCore(HttpContextBase httpContext) 
{ 
    return this.Repository.UserIsAdmin(httpContext.User.Identity.Name); 
} 

我怎樣才能城堡到存儲庫傳遞到屬性構造喜歡它爲控制器構造函數做?

回答

1

你基本上有兩種選擇。將過濾器包裝在代理中,可以找到一個很好的例子here

或者,在您的自定義過濾器中,您可以執行顯式容器調用。例如使用StructureMap(我有沒有廣泛使用的城堡)

ObjectFactory.GetInstance(IStoryRepository) 

有可能是延長ActionInvoker做注射第三種方式,但我不知道如何做到這一點來完成。

0

我可能會看看FluentMVC項目。它允許你在啓動時配置屬性,並且因爲它使用引擎蓋下的windsor,所以應該允許它輕鬆地注入pritty。例如

FluentMvcConfiguration.Configure = x => { 
           x.UsingControllerFactory(new WindsorControllerFactory());                x.WithFilter<HandleErrorAttribute>(); 
           x.WithFilter<AuthorizeAttribute>(
            Except 
             .For<AccountController>(ac => ac.LogOn()) 
             .AndFor<AccountController>(ac => ac.LogOn(null, null, false, null)) 
             .AndFor<HomeController>()); 
          }; 

上面的代碼將AuthorizeAttribute添加到除登錄的所有行動和家庭控制器

不知道什麼項目的當前狀態,但已經使用了幾次,效果很好爲了我。

0

問題是,屬性是通過反射而不是通過可以被攔截的調用來構造的,並且被調用到容器的調用所取代。

有很多方法可以用來創建可以支持DI的過濾器,最簡單的IMHO是擴展動作調用者並覆蓋GetFilters,提供一個實現,該實現使用該屬性來確定過濾器類型,然後解析該類型從容器中。這種方法的實現可以在MvcTurbine(http://mvcturbine.codeplex.com/sourcecontrol/changeset/view/37298?projectName=mvcturbine#758440)中看到。

0

爲什麼不從Filter構造函數中的靜態工廠方法獲取IRepository對象?您只是使用工廠方法來允許DI完成工作。

DI將在您的「網關」方法上工作,而不是標準的「構造器參數」方法。

相關問題