Вопрос

Я довольно новичок в 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? Я пробовал метод инъекции, но безрезультатно.

Я забыл объяснить, что то, что я пытаюсь достичь, - это своего рода прикованная инъекция, когда экземпляр класса PatureRecordSummary вводится с примером MockPatientRecordLocator (с использованием инъекции конструктора) и указанный экземпляр MockPatientRecordLocator должен вводить экземпляр icontactadapter снова используя инъекцию конструктора (если возможно)). Первая часть цепочки работает, вторая нет.

Это было полезно?

Решение

Неплохо для первого вопроса!

Вы хотите использовать Bind(Type) перегрузка, позволяющая оформлять вещи, которые у вас нет статически доступных в контексте вашего Load() код - делайте вещи, которые вы делаете в своем провайдере (т. Е. Удаление Type) вперед. Это позволит Ninject сделать объектную атмосферу (без каких-либо требований к по умолчанию.

Iirc. два или 3 моих самых последних ответа Также прикоснитесь к этому материалу открытия / загрузки и имеют примеры, которые должны иметь отношение к вашему случаю.

(И вы не должны прибегать к [Inject] атрибуты, когда вы получили, чтобы удалить вещи)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top