2015-11-18 3 views
2

Я пытаюсь использовать Ninject с моей оболочкой регистрации приложений.Ninject pass конструктор аргумент typeof класс, который реализует интерфейс

Вот обертка:

public class NLogLogger : ILogger 
{ 
    private readonly Logger _logger; 

    public NLogLogger(Type t) 
    { 
     _logger = LogManager.GetLogger(t.Name); 
    } 
} 

Как вы можете видеть, я передаю тип в constrctor регистраторы, поэтому я хотел бы использовать его как следующее:

public class EntityObject 
{ 
    public ILogger Logger { get; set; } 

    public EntityObject() 
    { 
     Logger = new NLogLogger(typeof(EntityObject)); 
    } 
} 

Теперь я не могу показаться, чтобы узнать, как сделать что-то подобное с использованием Ninject. Вот мой обязательный модуль:

public class LoggerModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<ILogger>().To<NLogLogger>(); 
    } 
} 

Теперь, очевидно, я получаю исключение брошенное, потому что он не может вводить типа в конструктор. Любые идеи, как я могу это сделать?

активирующего Ошибка Типа

Нет соответствующих привязок не доступны, и тип не является самим-Привязываемым.

путь

Активация:

4) Инъекции типа зависимостей в параметр т конструктора типа NLogLogger

3) Инъекции зависимостей ILogger в параметр лесопогрузчика конструктора типа NzbGetSettingsService

2) инъекций зависимости ISettingsService {NzbGetSettingsDto} в параметр nzbGetService конструктора типа DashboardController

1) Запрос DashboardController

ответ

2

Если предположить, что ваши классы выглядеть следующим образом:

public class EntityObject 
{ 
    public ILogger Logger { get; set; } //it is better by the way to convert this into a private field 

    public EntityObject(ILogger logger) 
    { 
     Logger = logger; 
    } 
} 

Вы должны зарегистрировать свою NLogLogger так:

Bind<ILogger>().To<NLogLogger>() 
    .WithConstructorArgument(
     typeof(Type), 
     x => x.Request.ParentContext.Plan.Type); 
+0

Awesome, спасибо. Я вытаскиваю свои волосы об этом! –

Смежные вопросы