6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 335
|
|||||||||||
1 | |||||||||||
Autofac Инъекция в метод21.07.2016, 02:57. Показов 4747. Ответов 22
Метки нет (Все метки)
Здравствуйте.
Есть у меня контейнер с необходимыми зависимостями, помеченными SingleInstance.
Можно ли как-нибудь вызвать метод объекта с передачей туда зависимостей, количество которых неизвестно? Грубо говоря, что-то типа этого:
0
|
21.07.2016, 02:57 | |
Ответы с готовыми решениями:
22
ASP + Autofac + SignalR Взаимная работа MvcSiteMapProvider с Autofac? Как правильно произносится Autofac (Dependecy Injection) php инъекция |
12062 / 8371 / 1280
Регистрация: 21.01.2016
Сообщений: 31,563
|
|
21.07.2016, 05:04 | 2 |
Kertis138, сама идея внедрения зависимостей базируется на работе не с экземплярами конкретных классов, а с интерфейсами (на крайний случай - с абстрактными классами). Это даёт возможность менять реализацию интерфейса в любой момент (для тестирования или при расширении возможностей ПО). А вот конструкция вида
builder.RegisterType<A>().AsSelf().SingleInstance(); ничем не лучше простого new A(); ,но, при этом, значительно всё усложняет - твой класс С как был привязан к классам А и В так и остался, только добавилась портянка из IoC-контейнера.Нет.
0
|
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 335
|
|
21.07.2016, 10:04 [ТС] | 3 |
У меня есть базовый абстрактный класс и от него наследуются многие подклассы. Сама идея была - в зависимостях получать те подклассы, которые необходимы. Почему не конструктор? Потому что может случится ситуация, когда два класса будут просить друг друга, а так как передача ссылок будет производиться в конструкторе, то вылетает ошибка.
Подскажите, какие образом тогда сделать общение между подклассами(модулями), которые наследуются от одного интерфейса?
0
|
12062 / 8371 / 1280
Регистрация: 21.01.2016
Сообщений: 31,563
|
|
21.07.2016, 10:18 | 4 |
Вот этот базовый класс и нужно использовать как зависимость. Но лучше, всё-таки, интерфейс.
Тогда зависимость одно из таких классов нужно инжектировать не в конструктор, а в свойство. Какого плана общение?
0
|
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 335
|
|
21.07.2016, 10:23 [ТС] | 5 |
Общая схема такая:
интерфейс - IModule и производные классы A,B,C... Один модуль может получить другой и вызвать его метод и и любая другая необходимая работа. А если все классы A,B,C... регистрируются вот так builder.RegisterType(X).AsSelf(<IModule>).SingleInstance(); То свойства надо сделать публичными и типа IModule? Просто не пойму, получается я регистрирую все под типом IModule, а что тогда Autofac подставлять будет, если вариантов много?
0
|
12062 / 8371 / 1280
Регистрация: 21.01.2016
Сообщений: 31,563
|
|
21.07.2016, 10:30 | 6 |
Правильнее было бы так:
builder.RegisterType<SomeClass>().AsImplementedInterfaces(); AutoFac будет выдавать последний зарегистрированный для этого интерфейса класс. В таком случае, рекомендую использовать свою собственную фабрику (которую внедрять в потребителей через тот же AutoFac), в которой разместить логику определения, когда какой реальный класс создавать для текущего потребителя.
1
|
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 335
|
|
21.07.2016, 10:45 [ТС] | 7 |
Менять реализацию интерфейса - это значит перестраивать производный класс на основе изменений в базовом?
0
|
12062 / 8371 / 1280
Регистрация: 21.01.2016
Сообщений: 31,563
|
|
21.07.2016, 11:02 | 8 |
Сообщение было отмечено Kertis138 как решение
Решение
Интерфейс != базовый класс. Он просто описывает... эм... интерфейс твоего будущего класса (сигнатуры методов и свойств). Менять реализацию, значит менять логику класса реализующего данный интерфейс, но не менять сам интерфейс. Т.е. интерфейс всегда один, но что в реале за ним скрыто - одному Богу известно (и тебе).
2
|
5 / 4 / 1
Регистрация: 24.09.2016
Сообщений: 398
|
|
06.12.2023, 00:11 | 9 |
0
|
12062 / 8371 / 1280
Регистрация: 21.01.2016
Сообщений: 31,563
|
|
06.12.2023, 05:12 | 10 |
0
|
5 / 4 / 1
Регистрация: 24.09.2016
Сообщений: 398
|
|
06.12.2023, 09:07 | 11 |
Usaga, по паттерну фабрика инфы много, меня интересует именно с использованием Autofac . . . думал - может вы порекомендуете примерчик по-проще на c#
0
|
06.12.2023, 09:59 | 12 |
Разве эта сама идея - не смысл работы библиотек внедрения зависимостей.
"хочу в конструкторе подставлять зависимости" = "хочу сделать свой DI" Считаю вот тут и корень проблемы. Можно даже создать коллекцию зависимостей одного типа, но это делается для возможности их использовать в ситуации когда неизвестен нужный тип, но его можно найти. Например, рендеры для разных типов объектов. Я перебираю коллекцию и нахожу нужный тип по какому-то флагу. Но они не должны и не могут между собой "общаться". Это значит сделанная архитектура на столько неправильная, что пришлось придумывать обходные пути - получить какие-то данные, состояния, значения из одного места в другом. Ну дак значит они и должны быть в других местах, не связанных с этими классами.
0
|
12062 / 8371 / 1280
Регистрация: 21.01.2016
Сообщений: 31,563
|
|
06.12.2023, 11:15 | 14 |
А в чём ты видишь сложность совместить фабрику с автофаком? Регистрируешь как обычный сервис. Тут отличий особых нет. Разве что, если сервисы, которые фабрика должна пораждать, сами создаются через автофак, то надо в конструктор фабрики заинжектить
IServiceLocator и всё.
0
|
5 / 4 / 1
Регистрация: 24.09.2016
Сообщений: 398
|
||||||
06.12.2023, 11:58 | 15 | |||||
Usaga, прежде чем самому что-то порождать - решил воспользоваться примером из ресурса Autofac. Но он не полный - потому ошибки. Не могли бы вы его завершить чтобы можно было его запустить в Студии ?
0
|
12062 / 8371 / 1280
Регистрация: 21.01.2016
Сообщений: 31,563
|
|
06.12.2023, 12:51 | 17 |
DLD, а что ты тут пытался реализовать?)
0
|
5 / 4 / 1
Регистрация: 24.09.2016
Сообщений: 398
|
|
06.12.2023, 13:15 | 18 |
Andrey-MSK, все хвалят что в Autofac поддержка лучше . . . к тому же кучу времени убил пока теорию читал . . . С другой стороны, даже если Autofac и DI от Microsoft равноценны - то кто-то задаст аналогичный вопрос - почему выбрал именно DI от Microsoft, а не Autofac
0
|
06.12.2023, 13:34 | 19 | ||||||||||
Работает в три строчки кода.
Добавлено через 4 минуты DLD, Dependency injection in WPF project with .net core
Тут очень топорно сделано, но общую картину показывает. Добавлено через 10 минут DLD, И потом просто инжектим нужные сервисы куда надо
1
|
5 / 4 / 1
Регистрация: 24.09.2016
Сообщений: 398
|
|
06.12.2023, 13:44 | 20 |
Usaga Пример взят отсюда
Я так понимаю. Тут при помощи фабрики делегатов нужно создать экземпляр класса, в котором при помощи метода GetQuote() будет инфа по акции: "ABC", 1234 Добавлено через 7 минут Andrey-MSK, спасибо большое . . . Однако . . . лично я не могу на данный момент времени постигнуть все разнообразие фреймворков, поэтому рассматриваю законченные проекты - попроще, которые запускаются в Консольном приложении - чтобы можно было пошагово пройтись по коду
0
|
06.12.2023, 13:44 | |
06.12.2023, 13:44 | |
Помогаю со студенческими работами здесь
20
SQL инъекция Инъекция кода. C# Инъекция и Сюръекция Инъекция кода Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |