2013-09-11 4 views
2

Я не могу заставить ninject автоматически создать экземпляр ILogger. У меня есть log4net, настроенный в моем приложении тестов и настроенный правильно, но по какой-то причине, когда я создаю экземпляр IHouseholdRepository, он не может работать с ILogger.Ninject и Log4Net

согласно этому сообщению, я сделал все, что мне нужно сделать: How To Properly Configure Ninject.Extensions.Logging.Log4Net in my MVC3 project

[TestMethod] 
public void TestMethod1() 
{ 
    var kernel = new StandardKernel(); 
    kernel.Bind<IHouseholdRepository>().To<HouseholdRepository>(); 

    var repo = kernel.Get<IHouseholdRepository>(); 
    var hh = repo.Find(123456); 
} 

public HouseholdRepository(ILogger logger, string username) 
{ 
    _logger = logger; 
    _username = username; 
    _dbContext = new HouseholdDbContext(logger); // I want to couple my HouseholdDBContect to my repository as it's not going to work with any other DbContext 
} 

Ошибка я получаю:

Метод испытания Rxxx.Tests .LoggingTester.TestMethod1 выбрал исключение: Ninject.ActivationException: Ошибка активации ILogger Нет соответствующих bindi ngs доступны, и тип не является самопереключаемым. Путь Активация: 2) Инъекция зависимостей ILogger в параметр регистраторе конструктора типа HouseholdRepository 1) Запрос IHouseholdRepository

Предложения: 1) Убедитесь, что вы определили привязку для ILogger. 2) Если привязка была определена в модуле, убедитесь, что модуль загружен в ядро. 3) Убедитесь, что вы случайно не создали несколько ядер. 4) Если вы используете аргументы конструктора, убедитесь, что имя параметра соответствует имени параметра конструктора. 5) Если вы используете автоматическую загрузку модуля, убедитесь, что путь поиска и фильтры правильные.

+2

Для общих интерфейсов ILog/ILogger существует несколько типов. Иногда я иногда использую Common.Logging.ILog вместо log4net.ILog. Это, конечно, приводит к исключению ActivationException. Вы проверили, что вы не используете, например, Castle.Core.Logging.ILogger или Masstransit.Logging.ILogger, или ...? – BatteryBackupUnit

+3

@BatteryBackupUnit +1 - Я часами смотрел на эту проблему. Причиной было заявление 'using', неправильно ссылающееся на' log4net.core' вместо 'Ninject.Extensions.Logging'. – CSL

+0

@CSL, ваш комментарий спас меня после нескольких часов разочарования. Это один из тех редких моментов, которые я желаю вынести на комментарий, предоставленный представителю. Благодарю. – kbrimington

ответ

5

У меня была такая же проблема, и выяснилось, что это было потому, что я забыл добавить пакет nugject Ninject.Extensions.Logging.Log4net nuget.

1

У меня была такая же проблема в проекте sitecore 8, и выяснилось, что это было потому, что ninject.dll в папке libs/Social не копируется в папку/bin с помощью предварительно созданного сценария, поэтому каждый раз, когда я чищу в папку/bin я столкнулся с этой проблемой. Предварительно построенный скрипт был построен в то время, когда в libs не было подпапок ...

0

У меня был такой же сбой, но по другой причине, и, хотя я не нашел этот вопрос полезным, я подумал, что добавлю свой ответ. Я использовал тестовый бегун ReSharper, который по умолчанию не использует отдельный домен приложения для каждой сборки. Результатом было то, что ядро ​​Ninject инициализировалось таким образом, что не для привязки необходимых интерфейсов расширения Log4Net.

Исправление должно было изменить параметры ReSharper: ReSharper | Варианты | Инструменты | Unit Testing and check «Использовать отдельный AppDomain для каждой сборки». Это прояснилось для меня. Надеюсь, это поможет кому-то еще!