1

テストするテストプロジェクトにNinject(v4.0.30319)パッケージをインストールしました。以下にテストコードを作成します。残念ながら、ValidateAbuse.Instance.Repositoryは常にNullです。NinjectがリポジトリをValidateAbuse.Repositoryプロパティにバインドしないのはなぜですか?コンストラクターバインディングの使用を提案する人もいるかもしれませんが、コード構造のために使用できません。以下のコードは単なる例であり、プロパティにバインドする方法を見つける必要があります。

常に失敗する試験方法

 [TestMethod]
        public void PropertyInjection()
        {
          using (IKernel kernel = new StandardKernel())
          {
              kernel.Bind<ISettingsRepository>().To<SettingsRepository>();
              Assert.IsNotNull(ValidateAbuse.Instance.Repository);
          }
        } 

リポジトリインターフェース

public interface ISettingsRepository
{
    List<string> GetIpAbuseList();
    List<string> GetSourceAbuseList();  
}

リポジトリの実装

 public class SettingsRepository : ISettingsRepository
    {
        public List<string> GetIpAbuseList()
        {
            return DataAccess.Instance.Abuses.Where(p => p.TypeId == 1).Select(p => p.Source).ToList();
        }

        public List<string> GetSourceAbuseList()
        {
            return DataAccess.Instance.Abuses.Where(p => p.TypeId == 2).Select(p => p.Source).ToList();
        }
    }

リポジトリをバインドしようとしているクラス

public class ValidateAbuse 
    {        
        [Inject]
        public ISettingsRepository Repository { get; set; }

        public static ValidateAbuse Instance = new ValidateAbuse();
}
4

1 に答える 1

3

Ninject は、オブジェクトのインスタンスを作成するときに、そのオブジェクトのプロパティのみをバインドします。Ninject で作成するのではなく、ValidateAbuse のインスタンスを作成しているため、インスタンスについて何も認識しないため、作成時にプロパティ値を設定できません。

編集:

ValidateAbuse から静的シングルトンを削除し、Ninject がそれをシングルトンとして管理できるようにする必要があります。

kernel.Bind<ValidateAbuse>().ToSelf().InSingletonScope();

次に、Ninject に ValidateAbuse のインスタンスを必要とするクラスを作成するように依頼すると、常に同じインスタンスが取得されます。

Ninject の仕組みや実装方法を完全には理解していないようですので、ウィキhttps://github.com/ninject/ninject/wiki/How-Injection-Worksを読んで、いくつかの基本的な例に従うことをお勧めします。それを既存のアプリケーションに接続しようとする前に。

于 2012-04-17T10:30:26.177 に答える