Рассмотрим следующий код, где мы реализуем ILogger
со всеми приложениями, используя BaseLogger
. Но тогда у нас есть сценарий, где мы должны войти где-то специфичные для клиента, например, базы данных или какой-либо предприятия App монитор таким образом, мы имеем CustomerSpecificLogger
, который также реализует ILogger
DI Chaining Dependencies with Ninject
В CTOR для CustomerSpecificLogger
требует тип ILogger быть принят in, в этом случае нам нужен экземпляр BaseLogger
для выполнения обеих функций ведения журнала.
Я знаю, как связать ILogger
с Ninject, но как вы связываете два разных ILoggers и рассказываете Ninject, когда их использовать?
interface ILogger
{
void Log(string msg);
}
class BaseLogger : ILogger
{
public void Log(string msg)
{
Console.WriteLine(msg);
}
}
class CustomerSpecificLogger : ILogger
{
private ILogger BaseLogger { get; set; }
CustomerSpecificLogger(ILogger baseLogger)
{
BaseLogger = baseLogger;
}
public void Log(string msg)
{
//Log to somewhere specific per customer request
BaseLogger.Log(msg);
}
}
Я пробовал искать для этого, но я борюсь с тем, что это будет называться. Так увы, я прихожу с пустыми руками.
Update Если я пытаюсь связать как, в надежде, что он использует некоторый тип индекса делать обязательные характер, ошибки из:
Bind<ILogger>().To<BaseLogger>();
Bind<ILogger>().To<CustomerSpecificLogger>();
Ошибка: Более одного согласования привязок доступны.
Update 2 Это называется ContextualBinding в Ninject и документально here
Я думаю, что я это понял, сейчас.
Это может помочь. https://github.com/ninject/Ninject/wiki/Contextual-Binding – Andrew