привязка к свойству всегда возвращает null

Я пытаюсь привязать репозиторий к свойству с помощью 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 above до class 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 ());
        }
}

Нинжект код активации

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 работает около недели без каких-либо успехов. В моем случае почему выбрасывается это исключение?

Также, пожалуйста, кто-нибудь опубликуйте рабочий пример с одной инъекцией репозитория в одноэлементный класс.


person Tomas    schedule 11.04.2012    source источник


Ответы (2)


Ninject не вводит статику. Измените койнвертер на нестатический класс и настройте его как Singleton в ninject. Также используйте внедрение конструктора и сделайте репо частным полем.

Теперь вы можете внедрить конвертер в конструкторы, где вам это нужно.

person Remo Gloor    schedule 11.04.2012
comment
Я обновил сообщение с кодом, я все еще не могу заставить его работать :( - person Tomas; 12.04.2012
comment
@Tomas Ваш код по-прежнему показывает статику - если вы не собираетесь удалять вопрос, который вы должны уточнить в своем сообщении с вопросом. - person Ruben Bartelink; 12.04.2012
comment
@Ruben Я опубликовал обновление с решением, которое не содержит статики. - person Tomas; 12.04.2012

Даже если вы используете инъекцию свойств, а не инъекцию конструктора, я думаю, что это все равно будет

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

Поскольку ninject все еще нужно знать, какой конкретный тип сопоставлять с интерфейсом.

Я не проверял это, поэтому извиняюсь, если это неправильно.

person Neil Thompson    schedule 11.04.2012