Ninject属性绑定,如何正确完成

时间:2012-04-17 09:18:13

标签: ninject

我在测试项目中安装了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();
}

1 个答案:

答案 0 :(得分:2)

Ninject只会在创建该对象的实例时绑定对象的属性。由于您正在创建ValidateAbuse的实例而不是创建它的Ninject,因此它不会知道任何有关它的内容,因此无法在创建时设置属性值。

编辑:

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

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

然后当你要求Ninject创建任何需要ValidateAbuse实例的类时,它将始终获得相同的实例。

好像你还没有完全理解Ninject是如何工作的或如何实现它所以我建议你阅读wiki https://github.com/ninject/ninject/wiki/How-Injection-Works并在尝试将其连接到现有应用程序之前遵循一些更基本的例子。 / p>