代码之家  ›  专栏  ›  技术社区  ›  scottrakes

Ninject停止注入我的属性

  •  10
  • scottrakes  · 技术社区  · 14 年前

    在MVC的一个基本控制器中,我有以下注入代码,它工作得很好。

     [Inject]
     private INavigationRepository navigationRepository { get; set; }
     [Inject]
     private ISessionService sessionService { get; set; }
    

    我没有得到构建错误,它在死亡的黄页中显示为“System.NullReferenceException:对象引用未设置为对象的实例。”并指向引用NavigationRepository的第一行代码。

    自代码工作以来,我可能很少修改代码,甚至支持这些修改,但仍然会出错。我可以用下面的代码绕过它,但是我失去了注入。有没有想过如何解决这个问题?

    private INavigationRepository navigationRepository;
        private ISessionService sessionService;
        public BaseController()
        {
            navigationRepository = new NavigationRepository();
            sessionService = new SessionService(new VolunteerRepository());
        }
    
    2 回复  |  直到 14 年前
        1
  •  34
  •   Remo Gloor    14 年前

    Ninject可以插入私有属性,但必须启用它。

    new StandardKernel( new NinjectSettings() { InjectNonPublic = true })
    

    但最好不要使用属性注入。只有在无法避免的情况下才能使用。例如,如果信息是由其他人创建的(attributeFilter)。否则,可以从外部无意识地设置依赖项,您需要inject属性wich为您提供对ioc容器的引用。我建议将依赖项添加到构造函数并使用构造函数注入。

        2
  •  1
  •   Erik van Brakel scottrakes    14 年前

    将物业改为公用工程。我想如果它是私人的,Ninject不能设置它。

    [Inject]
    public INavigationRepository navigationRepository { get; set; }
    [Inject]
    public ISessionService sessionService { get; set; }