Я новичок в Ninject, но мне удалось успешно использовать его для DI с помощью настраиваемого провайдера.
Привязка инициализируется следующим образом
kernel = new StandardKernel();
kernel.Bind<IPatientRecordLocator>().ToProvider<PatientRecordLocatorProvider>();
и в настраиваемом провайдере я вызываю Activator.CreateInstance вот так
protected override IPatientRecordLocator CreateInstance(IContext context)
{
var name = ConfigurationManager.AppSettings["PatientRecordLocator"];
var typeName = name.Split(',')[0];
var assemblyName = name.Split(',')[1];
return Activator.CreateInstance(assemblyName, typeName).Unwrap() as IPatientRecordLocator;
}
(да, я знаю, что в приведенном выше коде нет обработки ошибок и т. д. :))
и все это работает как шарм.
Теперь проблема, с которой я столкнулся, заключается в том, что я представляю новый класс, который хочу внедрить в экземпляры IPatientRecordLocator. Проблема возникает, когда я добавляю конструктор, подобный следующему, например, один из этих классов
[Inject]
public MockPatientRecordLocator (IContactAdapter contactAdapter)
{
...
}
Затем, чтобы Activator.CreateInstance работал, мне также нужно добавить конструктор без параметров в класс MockPatientRecordLocator, т.е.
public MockPatientRecordLocator()
{
}
Итак, мой вопрос: как я могу заставить Ninject внедрить экземпляр класса, который реализует IContactAdapter, например, MockPatientRecordLocator? Я пробовал метод инъекции, но безуспешно.
Я забыл объяснить, что то, что я пытаюсь достичь, - это своего рода цепная инъекция, при которой экземпляр класса PatientRecordSummary вводится с экземпляром MockPatientRecordLocator (с использованием инъекции конструктора), и в указанный экземпляр MockPatientRecordLocator должен быть введен экземпляр IContactAdapter ( снова с помощью внедрения конструктора (если возможно)). Первая часть цепочки работает, вторая - нет.