#c# #ninject
#c# #ninject
Вопрос:
Можно ли использовать Ninject для настройки инъекции без интерфейса?
public EntityController([Named("EntityServiceName")] EntityService service)
вместо
public EntityController([Named("EntityServiceName")] IEntityService service)
Я пытаюсь сделать именно это и сталкиваюсь с проблемами, и мне было интересно, не проблема ли в том, что я не использую интерфейсы.
Дополнительная информация: Возможно, я ошибаюсь, но вот преимущество, на которое мы надеемся: мы следуем шаблону DDD с архитектурой onion / ports и адаптеров, поэтому у нас есть доменный проект с конкретными объектами домена и службами домена, а также определенными внешними интерфейсами, инфраструктурный проект, который реализуетвнешние интерфейсы, определенные в домене, и, наконец, проект веб-api для их предоставления.
Контроллеры веб-api должны иметь экземпляр служб домена, внедренных в них. Но поскольку между интерфейсом и доменной службой будет соотношение 1: 1, кажется ненужным просто добавлять интерфейсы для доменных служб.
Таким образом, на самом деле нет никакой пользы в создании интерфейса для доменных служб, но я все равно хотел бы настроить и внедрить их через Ninject.
Ответ №1:
Вы можете … да. Но это мало что дает. Вот пример:
kernel.Bind<List<string>>().ToConstant(new List<string>(){"Foo", "Bar"});
Но если вы не используете интерфейс, вы не получите большой пользы от внедрения зависимостей. И, очевидно, это ничего не дает по сравнению с ICollection. Я полагаю, вы могли бы использовать его для установки значений класса по умолчанию и при этом получить преимущество модульного тестирования… но делать это с интерфейсами, как правило, будет намного лучше, поскольку вы можете гораздо лучше издеваться. Я бы сделал это только для самых базовых классов.
Комментарии:
1. Почему вы не получаете от этого особой пользы? В моем случае у меня есть контроллер в веб-проекте, в который вводится служба, которая находится в основном проекте, который необходимо ввести с помощью IRepository (интерфейс также определен в основном проекте), реализация которого определена в проекте инфраструктуры. Служба домена должна быть внедрена в контроллер, но на самом деле нет никакой другой выгоды от наличия интерфейса для нее. Издевательство выполняется с помощью виртуальных методов (как было рекомендовано в некоторых других потоках). Я что-то здесь упускаю?
2. Этот ответ оказался правильным, вы можете вводить конкретные классы с помощью Ninject. Все еще не уверен, почему это не было бы полезно в некоторых случаях.