Выполнение порядка внедрения конструктора и свойства с помощью ninject 2 - PullRequest
1 голос
/ 27 ноября 2010

Я загружаю недействительный модуль в свой проект (WCF) и хочу подключить log4net в своем модуле с помощью специального провайдера. Причина, по которой я использую провайдера, заключается в том, что метод GetLogger должен пройти класс, в котором выполняется инъекция. Если это не способ сделать это, пожалуйста, дайте мне знать, я новичок в Ninject. (Кстати, Context.getType () не правильно, у меня возникли некоторые проблемы с этим.)

Основная проблема заключается в том, что мои переменные ILog в моих классах инициализируются после выполнения конструктора, но я хочу иметь возможность использовать протоколирование в моем конструкторе. Я также использую Ninject для вызова моего конструктора и привязки его параметров к конкретным классам.

Bind<IBroker>().To<Broker>(); // constructor
Bind<ILog>().ToProvider(new log4netILogProvider()) // property
private class log4netILogProvider : Ninject.Activation.Provider<ILog>
    {
        protected override ILog CreateInstance(IContext context)
        {
            return LogManager.GetLogger(context.getType());
        }
    }

Вся помощь приветствуется.

Ответы [ 2 ]

2 голосов
/ 28 ноября 2010

Ни одна структура IoC никогда не сможет выполнить внедрение свойства до внедрения конструктора. Платформа IoC может делать только то же самое, что вы можете делать на фабрике, написанной вручную. Вы не можете получить доступ к свойству объекта на фабрике, пока он не был создан правильно? Так что не могу IoC рамки.

В основном у вас есть два варианта.

  1. Сделать конструктор инъекций (предпочтительно)
  2. Выполните внедрение метода и выполните код конструктора в методе.

    [Inject]
    public void Initialize(ILog log) { ... } 
    
0 голосов
/ 12 ноября 2011

Я бы также предложил третий вариант. Вы можете реализовать интерфейс IInitializable в Ninject, а затем посмотреть, не можете ли вы переместить код, основанный на свойстве injecttor, в вашу реализацию Initialize (). Ninject гарантирует, что все инъекции в конструктор и правильные инъекции завершены до вызова Initialize.

...