Ninject属性绑定,如何正确地做(Ninject property binding, how t

2019-10-16 15:01发布

我在测试项目来测试安装Ninject(v4.0.30319)封装。 创建测试代码下面,不幸ValidateAbuse.Instance.Repository总是空。 为什么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();
}

Answer 1:

当创建一个对象的实例Ninject将只在对象上绑定属性。 因为要创建ValidateAbuse而不是Ninject的创建它的实例,也不会知道这件事,所以无法在创建时设置的属性值。

编辑:

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

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

然后当你问Ninject创建需要ValidateAbuse的一个实例任何类,它总是会得到相同的实例。

好像你不完全了解Ninject如何工作以及如何实现它,所以我会建议你阅读维基https://github.com/ninject/ninject/wiki/How-Injection-Works和遵循一些更基本的例子之前,试图将其连接到现有的应用程序。



文章来源: Ninject property binding, how to do correctly
标签: ninject