2012-04-17 74 views
1

我已经在测试项目中安装了Ninject(v4.0.30319)包来测试。在下面创建测试代码,不幸的是ValidateAbuse.Instance.Repository始终为空。为什么Ninject不会将存储库绑定到ValidateAbuse.Repository属性? 你们中的一些人可能会建议使用构造函数绑定,但由于代码结构,我无法使用它。下面的代码只是示例,我需要找到绑定到属性的方法。Ninject属性绑定,如何正确

测试方法,它总是失败

[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(); 
} 

回答

2

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

编辑:

您应该删除从ValidateAbuse的静态单,并允许Ninject将其管理为单身。

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

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

看来你并不完全理解Ninject如何工作或如何实现它,所以我建议你阅读wiki https://github.com/ninject/ninject/wiki/How-Injection-Works并遵循一些更基本的例子,然后再尝试将它连接到现有的应用程序。

+0

那么如何创建ValidateAbuse类并使用注入库? – Tomas 2012-04-17 10:55:54

+0

我已经阅读过这篇文章,但对目前的情况并没有帮助。你只是写了如何创建一个类的实例并绑定它。但如何获得实例?我有抽象类ConverterBase,我需要从该类访问单例ValidateAbuse实例。我无法使用ConverterBase构造函数来注入ValidateAbuse类。如果我用Inject属性添加属性,Ninject什么也不做。 – Tomas 2012-04-17 12:53:33

+2

正如我所说的,这是因为你没有通过Ninject解决实例。您需要使用Ninject来创建需要解决依赖关系的实例。阅读本页https://github.com/ninject/ninject/wiki/The-Activation-Process – 2012-04-17 13:07:07