17

NInject がどのようにそれを行うことができ、AutoFac がそれを行うことができるかを見たので、 Castle Windsor を使用して MVC ActionFilters に依存関係を注入する方法を理解しようとしています。

現時点では、醜い静的 IoC ヘルパー クラスを使用して、次のようなコンストラクター コードからの依存関係を解決しています。

public class MyFilterAttribute : ActionFilterAttribute
{    
  private readonly IUserRepository _userRepository;
  public MyFilterAttribute() : this(IoC.Resolve<IUserRepository>()) { }
  public MyFilterAttribute(IUserRepository userRepository)
  {
     _userRepository = userRepository;
  }
}

その静的なアンチパターン IoC をフィルターから削除したいと思います。

ウィンザー城でそれを行う方法についてのヒントはありますか?

いいえ、DI フレームワークを変更することはできません。

4

2 に答える 2

18

これが必要になったとき、他の人が Ninject と Windsor で行った作業に基づいて、自分の ActionFilters にプロパティ インジェクションの依存関係を取得しました。

于 2009-11-06T12:41:11.617 に答える
11

汎用属性を作成します。ctorが引数としてTypeを使用するMyFilterAttribute-つまり、次のようなものです。

public class MyFilterAttribute : ActionFilterAttribute {
    public MyFilterAttribute(Type serviceType) {
        this.serviceType = serviceType;
    }

    public override void OnActionExecuting(FilterExecutingContext c) {
        Container.Resolve<IFilterService>(serviceType).OnActionExecuting(c);
        // alternatively swap c with some context defined by you
    }

    // (...) action executed implemented analogously

    public Type ServiceType { get { return serviceType; } }
    public IWindsorContainer Container { set; get; }
}

次に、参照している2つの記事と同じアプローチを使用して、アクションの呼び出し方法を制御し、WindsorContainerを属性に手動で挿入します。

使用法:[MyFilter(typeof(IMyFilterService))]

実際のフィルターは、IMyFilterServiceを実装するクラスに含まれ、IMyFilterServiceは次のようなIFilterServiceを実装する必要があります。

public interface IFilterService {
    void ActionExecuting(ActionExecutingContext c);
    void ActionExecuted(ActionExecutedContext c);
}

このようにすると、フィルターはASP.NET MVCに関連付けられず、属性は単なるメタデータの一部になります。これは、実際に想定されている方法です。:-)

于 2009-02-16T14:06:56.747 に答える