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