Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Анотации(атрибуты) есть, если есть желание, или надо что-то уточнить.
Мы свято уверены, что анотации в этом случае это зло, так как
а) тянут зависимость на конкретную реализацию контейнера.
б) это дополнительный код, кторый можно писать. Если контейнер может сам разрулить… Вперед. Пусть сам разруливает.
Эм. А что ваша текущая реализация неконтейнерозависима?
Основная идея аннотаций в том чтобы писать меньше кода и разруливанием занимался контейнер. Иначе зачем он нужен?
Если я вас правильно понял, то вы подразумеваете что анотация это что-то что вешается на клас или на интерфейс и указывает где искать соотвевенно интерфейс или реализацию? Если это так то у нас этот подход не прижился.
@Autowired
ClientDao dao;
@Repository
JpaClientDao implements ClientDao
Я не понял, вашего вопроса, но проиллюстрирую свою мысль. Аннотация это часть IoC фреймворка. Значит, как только вы повесили эту аннотацию, вы получили зависимость на фреймворк.
Наверное, вы должны привести примерчик. Потому как мы пишем без аннотаций, и у нас контейнер все разруливает сам.
container.BasedOn<IRepository>();
Я вообще-то намекаю что вы в любом случае используя IoC зависите от используемого фреймворка
container.BasedOn();
Что обозначает, зарегестрировать все репозитарии(то что наследуется от IRepository, тоесть IOrderRepository, IProductRepository) и их реализации (NHibOrderRepository, NHibProductRepository). Заместо базового интерфейса я могу использовать аннотацию, а могу и вообще по имени(точнее по суфиксу). Это и есть конвеншены. Тоесть мы в команде договриваемся что будет обозначать что это компонент. Мы не завязаны на конкретные атрибуты (хоть и можем их использовать). И таким макаром можно зарегестрировать все. И никаких анотаций в каждом класе ;).
Вам прийдется в обязательном порядке наследоваться от IRepository или эе писать на каждый интерфейс по такой записи. Опять же не совсем понятно как это дальше будет использоваться. Как у вас написано выше спросить у контейнера какой instance будет я правильно понял?
А я вам пытаюсь обьяснить что это не так. Есть три компонента. Контракты(интерфейсы), Реализации и собсно Приложение. Так вот первых два компонента, вообще невкурсе что существуют IoC контейнеры. Про IoC знает только Приложение. Да и то в достаточно ограниченной форме. Все знания Приложения о IoC контенере заканчиваются на фактори класах рутовых обьектов(как пример контроллеры в веб приложении, или презентеры в десктопном).
А в случае использования аннотаций интерфейсам и реализациям надо знать про фреймворк. Да действительно это так, но в противном случае вам прийдется или прийдется инжектинг прописывать в конфигуации или в приложении. Что будет способствовать написанию кучи конфигурационного кода. Который опять же прийдется переписывать если вы будете изменять фреймворк. Единственный плюс возникает только при написании нескольких приложений с разными фреймворками. Но в реальности такое бывает редко.
Я вообще-то намекаю что вы в любом случае используя IoC зависите от используемого фреймворка. Если вы его поменяете вам прийдется переписывать код
Разве @Autowired, @Repository не являются своего рода аннотациями (читай фреймворкоспецифичные вещи)?
Если не использовать аннотации/аттрибуты, то базовый код не имеет зависимости от фреймворка. Её будет иметь только прикладной код, которому необходимо каким-то образом настроить зависимости в коде ниже перед использованием.
Service Locator — один из способов инверсии зависимости (IoC)
наличие в конструкторе «непонятного» IUnityContainer
Использование IoC контейнеров. За и Против