2009-08-18 18 views
6

私はCastle 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

基本的に2つのオプションがあります。プロキシでフィルタをラップすると、その良い例はhereです。

または、カスタムフィルタ内で明示的なコンテナコールを行うことができます。 StructureMap(私は広範囲に全く使用城を持っていない)

ObjectFactory.GetInstance(IStoryRepository) 

を使用してたとえば注入を行うためにActionInvokerを拡張することですが、私は、これはどのように行われるかわからない第三の方法があるかもしれません。

0

私はFluentMVCプロジェクトを検討する価値があるかもしれません。起動時に属性を設定することができます。また、フードの下でウィンザーを使用するので、簡単に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

なぜIRepositoryオブジェクトは、Filterコンストラクタ内の静的ファクトリメソッドから取得しませんか?あなたはDIがその仕事をすることを可能にする方法でファクトリメソッドを使用するだけです。

DIは、標準の "コンストラクタパラメータ"の代わりに "ゲートウェイ"メソッドで動作します。

関連する問題