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 只会在创建该对象的实例时绑定该对象的属性。由于您正在创建 ValidateAbuse 的实例而不是 Ninject 创建它,它不会知道任何关于它的信息,因此无法在创建时设置属性值。

编辑:

您应该从 ValidateAbuse 中删除静态单例,并允许 Ninject 将其作为单例进行管理。

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

然后,当您要求 Ninject 创建任何需要 ValidateAbuse 实例的类时,它总是会得到相同的实例。

似乎您不完全了解 Ninject 的工作原理或如何实现它,所以我建议您阅读 wiki https://github.com/ninject/ninject/wiki/How-Injection-Works并遵循一些更基本的示例在尝试将其连接到现有应用程序之前。

于 2012-04-17T10:30:26.177 回答