绑定到属性始终返回null

时间:2012-04-11 14:46:21

标签: ninject ninject.web.mvc

我正在尝试使用Ninject将存储库绑定到属性,但始终获取绑定对象的空引用。我将使用下面的代码解释这个问题。

   public interface IServiceRepository
    {
        User GetUser(string email);
        IQueryable<Statistic> GetStatisticForCurrentMonth(string ip);
        void InsertStatistic(ConversionModel conversionModel);

class ServiceRepository : IServiceRepository
{
//Implementation of the Interface
}

创建课程时,我想bind the repository aboveclass below。遗憾的是,Repository对象始终为null。也许我误解了Ninject是如何工作的?如何解决问题?

    public class Converter
    {
        [Inject]
        public static IServiceRepository Repository { get; set; }
        private static Converter _converter;

        public static Converter Instance
        {
            get { return _Converter  ?? (_Converter  = new Converter ());
        }
}

Ninject激活码

private static void RegisterServices(IKernel kernel)
{
   kernel.Bind<IServiceRepository>().ToMethod(context => Converter.Repository);
}   

更新

我试图像这样重写代码

 public class Converter
    {
        private readonly IServiceRepository _repository;

        public Converter(IServiceRepository repository)
        {
            _repository = repository;
        }

//skip code
}

测试......

    [TestMethod]
    public void ConverterInstanceCreated()
    {           
         using (IKernel kernel = new StandardKernel())
         {                 
             kernel.Bind<IServiceRepository>().To<ServiceRepository>();
             Assert.IsNotNull(kernel.Get<Converter>());
         }
    }

给出例外

Test method PC.Tests.NinjectTest.ConverterInstanceCreated threw exception: 
Ninject.ActivationException: Error activating IServiceRepository
No matching bindings are available, and the type is not self-bindable.
Activation path:
  2) Injection of dependency IServiceRepository into parameter repository of constructor of type Converter
  1) Request for Converter

我刚刚输了,我试图了解Ninject如何工作一周而没有任何成功。在我的情况下,为什么抛出这个异常?

另外请有人将一个存储库注入到单例类的工作示例发布。

2 个答案:

答案 0 :(得分:2)

Ninject不会注射静力学。将coynverter更改为非静态类,并在ninject中将其配置为Singleton。还使用构造函数注入并使repo成为私有字段。

现在您可以将转换器注入您需要的构造函数。

答案 1 :(得分:0)

即使您使用Property注入而不是Constructor注入,我认为它仍然是

private static void RegisterServices(IKernel kernel)
{
  kernel.Bind<IServiceRepository>().To<ServiceRepository>();
}

因为ninject仍然需要知道要映射到接口的具体类型

如果这是错误的话,我没有对此进行过测试。