0

次のように MVC 属性を設定しています。

public class Activity : FilterAttribute
{
    public string[] Tags { get; set; }
    public Directive Directive { get; set; }
}

および対応するフィルター クラス

public class ActivityFilter : IActionFilter
{
    public ActivityFilter(IService service, IEnumerable<string> tags, Directive directive)
    {
       ...
    }
}

インジェクションをフィルターするための属性のバインディングは次のようになります。

this.BindFilter<ActivityFilter>(FilterScope.Action, 0)
  .WhenActionMethodHas<Activity>()
  .WithPropertyValueFromActionAttribute<Activity>("tags", a => a.Tags)
  .WithPropertyValueFromActionAttribute<Activity>("directive", a => a.Directive);

Web サイトをデバッグしようとすると、int に対応するバインディングが利用できないため、ActivityFilter を有効にできないというエラーが Ninject から表示されます。具体的には次のとおりです。

ActivationException: int のアクティブ化でエラーが発生しました 一致するバインディングが利用できず、型が自己バインド可能ではありません。アクティベーション パス:

2) ActivityFilter 型のコンストラクターのパラメーター ディレクティブへの依存関係 int の注入

1) ActivityFilter のリクエスト

Ninject が列挙パラメータを整数と誤解しているようですが、この問題を解決する方法がわかりません。

4

1 に答える 1

0

問題は、バインディングに使用していた方法でした。

this.BindFilter<ActivityFilter>(FilterScope.Action, 0)
   .WhenActionMethodHas<Activity>()
   .WithPropertyValueFromActionAttribute<Activity>("tags", a => a.Tags)
   .WithPropertyValueFromActionAttribute<Activity>("directive", a => a.Directive);

WithConstructorArgumentFromActionAttributeコンストラクター引数に注入しようとしていたので、使用する必要がありました (コンストラクター/プロパティが宛先ではなく、値のソースを参照していると誤って考えました。)

これを変更したら、うまくいきました。

于 2013-10-15T20:29:47.577 に答える