3

検証を実行するためにデータベースにアクセスする必要がある場所に検証属性を設定しています。プロジェクトの他の場所と同じ方法でプロパティインジェクションを設定しようとしましたが、機能しません。どのステップが欠けていますか?

public class ApplicationIDValidAttribute : ValidationAttribute
{
    [Inject]
    protected IRepository<MyType> MyRepo;

    public override bool IsValid(object value)
    {   
       if (value == null)
         return true;

       int id;
       if (!Int32.TryParse(value.ToString(), out id))
         return false;

       // MyRepo is null here and is never injected
       var obj= MyRepo.LoadById(id);
       return (obj!= null);
    }

もう1つ指摘しておきたいのは、非公開プロパティを注入するようにNinjectカーネルを設定しているので、それが問題だとは思わないということです。Ninject 2、MVC 2、およびMVC2バージョンのNinject.Web.MVCを使用しています。

ありがとう!

4

2 に答える 2

2

Ninjectの作者によるこの投稿によると:

フィールドインジェクション:Ninject 2のインジェクションは、式ツリーによって駆動されるようになりました。.NET3.5では、式ツリーを使用してフィールド値を設定する方法はありません。とにかくこれは悪い習慣なので、私はそれをカットすることにしました。

第二に、MVC2で私が知る限り、デフォルトでは属性は制御の反転を介して構築されないため、Ninjectがフィールドインジェクションをサポートしていても、これは機能しません。

簡単な解決策の1つは、次のように属性コンストラクターでServiceLocatorを使用することです。

public ApplicationIDValidAttribute()
{
  MyRepo = ServiceLocator.Current.GetInstance<IRepository<MyType>>();
}

Service Locatorに慣れていない場合は、codeplexでServiceLocatorに関する情報を見つけることができます。ここでは、ServiceLocatorの使用を意味しない2番目の少し難しいアプローチについて説明します

于 2010-05-03T10:30:29.060 に答える
1

レポメンバーにゲッターとセッターが必要だと思います。ninjectサポートプロパティインジェクション

コードをこれに変更するだけで、機能するはずです。

[Inject]
public IRepository<MyType> MyRepo{
    get; set;
}
于 2013-02-11T12:09:31.080 に答える