5

私はウィンザー城であり、使用されているリポジトリを渡す際にコントローラーコンストラクターに最適です。

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

これで、メインの管理メニューを表示するための管理領域にあるアクションができました。ログインしているユーザーが管理者であることを確認するカスタム認証属性を使用しました (users テーブルの 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);
 }

コントローラ コンストラクタの場合のように、Castle にリポジトリを属性コンストラクタに渡すにはどうすればよいですか?

4

4 に答える 4

1

基本的に 2 つのオプションがあります。フィルターをプロキシでラップします。これの良い例がここにあります。

または、カスタム フィルター内で明示的なコンテナー呼び出しを行うことができます。たとえば、StructureMap を使用します (私は城をあまり使用していません)。

ObjectFactory.GetInstance(IStoryRepository)

ActionInvoker を拡張して注入を行うという 3 番目の方法があるかもしれませんが、これがどのように行われるかはわかりません。

于 2009-08-18T08:44:21.060 に答える
0

Filterコンストラクター内の静的ファクトリメソッドからIRepositoryオブジェクトを取得しないのはなぜですか?DIがその作業を実行できるようにする方法でファクトリメソッドを使用するだけです。

DIは、標準の「コンストラクターパラメータ」アプローチではなく、「ゲートウェイ」メソッドで機能します。

于 2009-12-28T14:17:31.310 に答える
0

FluentMVCプロジェクトを見る価値があるかもしれません。起動時に属性を構成できます。フードの下でウィンザーを使用するため、これを簡単に注入できるはずです。例えば

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>());
                             };

上記のコードは、Login とホーム コントローラーを除くすべてのアクションに AuthorizeAttribute を追加します。

プロジェクトの現在の状態はわかりませんが、数回使用しており、私にとってはかなりうまく機能しています。

于 2009-08-18T14:31:14.333 に答える
0

問題は、属性が、インターセプトされ、コンテナーに委譲する呼び出しに置き換えられる可能性のある呼び出しではなく、リフレクションによって構築されることです。

DI をサポートできるフィルターを作成するために使用できるアプローチは多数あります。最も簡単な方法は、アクション インボーカーを拡張して GetFilters をオーバーライドし、属性を使用してフィルター タイプを決定し、コンテナーからそのタイプを解決する実装を提供することです。このアプローチの実装は、MvcTurbine ( http://mvcturbine.codeplex.com/sourcecontrol/changeset/view/37298?projectName=mvcturbine#758440 ) で見ることができます。

于 2009-12-22T01:58:55.040 に答える