bind to property always return null

2019-09-06 11:24发布

I am trying to bind a repository to property using Ninject but always get null reference of binding object. I will explain the problem using code below.

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

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

I am would like to bind the repository above to class below while the class is created. Unfortunately Repository object is always null. Maybe I have misunderstood how Ninject is working? How to solve the problem?

    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 activator code

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

Update

I have tried to rewrite code like this

 public class Converter
    {
        private readonly IServiceRepository _repository;

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

//skip code
}

The test...

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

gives exception

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

I just lost, I am trying to understand how Ninject is working for about week without any success. In my case why this exception is thrown?

Also please someone post working example with one repository injection to singleton class.

2条回答
孤傲高冷的网名
2楼-- · 2019-09-06 11:42

Even though you are using Property injection and not Constructor injection I think it would still be

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

As ninject still just needs to know what concrete type to map to the Interface

I haven't tested this so apologies if it's wrong.

查看更多
叛逆
3楼-- · 2019-09-06 12:00

Ninject does not inject statics. Change the coynverter to a non-static class and configure it as Singleton in ninject. Also use constructor injection and make the repo a private field.

Now you can inject the converter to the constructors where you need it.

查看更多
登录 后发表回答