Использование Ninject 2.0 с ASP .Net 3.5 - PullRequest
3 голосов
/ 27 февраля 2010

Я пытаюсь использовать Ninject 2.0 с веб-приложением Asp .Net 3.5. Ниже приведены библиотеки DLL и их версии, которые я использую.

  • Ninject.dll - v2.0.0.0
  • Ninject.Extensions.Logging.dll v2.0.0.0
  • Ninject.Web.dll v1.0.0.0

В моем global.ascx.cs у меня есть следующий метод.

protected override IKernel CreateKernel()
    {
        IKernel kernel = new StandardKernel();            
        kernel.Bind<IDataAccess>().To<DataAccessEntBlock>().InSingletonScope();
        return kernel;
    }

Когда я запускаю приложение, я получаю следующую ошибку.

Error activating ILoggerFactory
No matching bindings are available, and the type is not self-bindable.
Activation path:
 1) Request for ILoggerFactory

Suggestions:
 1) Ensure that you have defined a binding for ILoggerFactory.
 2) If the binding was defined in a module, ensure that the module has been loaded into the kernel.
 3) Ensure you have not accidentally created more than one kernel.
 4) If you are using automatic module loading, ensure the search path and filters are

правильный.

Я не понимаю, хотя я не пытаюсь зарегистрировать Logger, похоже, он пытается создать свой собственный. Как я могу устранить эту ошибку? Нужно ли использовать какое-либо расширение Logger от Ninject?

Спасибо GK

Ответы [ 2 ]

6 голосов
/ 27 февраля 2010

Ошибка указывает, что где-то Ninject пытается разрешить интерфейс ILoggerFactory для конкретного класса. Исходя из того, что вы указали в качестве ссылок выше, похоже, что ваше веб-приложение ASP.Net основано на WebForms, а не на ASP.Net MVC.

Имея это в виду, ваши страницы должны быть получены из PageBase, который является абстрактным классом, предоставляемым веб-библиотекой Ninject. Этот класс имеет следующее определение свойства:

[Inject]
public ILogger Logger { get; set; }

Поэтому, когда создается ваша страница, Ninject пытается внедрить регистратор в свойство на странице. Как намекает на ошибку, вам нужна привязка, определенная для ILoggerFactory, а также ILogger; однако единственная привязка, которую вы указали, относится к IDataAccess. Вам также необходимо загрузить один из модулей, определенных в библиотеке расширений журналирования. Я считаю, что вы можете выбрать между NLog и Log4Net. Так, например, если вы хотите использовать Log4Net, ваша функция CreateKernel будет выглядеть так:

protected override IKernel CreateKernel()
{
    IKernel kernel = new StandardKernel(new Log4netModule());            
    kernel.Bind<IDataAccess>().To<DataAccessEntBlock>().InSingletonScope();
    return kernel;
}

Предполагается, что в файле есть оператор using Ninject.Extensions.Logging.Log4net;.

В любом случае вам нужно выбрать регистратор и загрузить его привязки (через модуль), как того требует веб-библиотека Ninject. Если у вас сейчас нет проблем с журналированием, вы можете предложить реализации ILoggerFactory и ILogger, которые ничего не делают (то есть, «нулевой» регистратор) и сами связывают ваш фиктивный ILoggerFactory.

1 голос
/ 26 мая 2010

У меня тоже была такая же проблема. Попробуйте снова сослаться на ddls log4net.dll, ninject.extensions.logging.dll, ninject.extensions.log4net.dd, ningject.web.dll и ninject.dll это решило мою проблему. скорее всего из-за старого log4net.dll.

...