Вопросы с тегами [dependency-injection]

0

голосов
1

ответ
9

Просмотры

Зависимости Разрешая Nestjs косяка

Не могу понять, в чем проблема моего кода. (Я новичок с nestjs, я пытаюсь узнать его, передавая некоторые приложения к нему). Журнал консоль говорит: Гнездо не может решить зависимости в UrlsAfipService (?). Пожалуйста, убедитесь, что аргумент с индексом [0] доступен в контексте ApiModule. UrlsAfipService импорт {инъекционные} из @ nestjs / общий "; импорт {AfipUrls} из @Injectable»./urls' () экспорт класса UrlsAfipService {конструктор (частный afipUrls только для чтения: AfipUrls,). {} getWSAA () {вернуться this.afipUrls.homo () wsaa; //
Marcelo J Forclaz
1

голосов
1

ответ
184

Просмотры

Внедрение зависимостей в развитии Дженкинс

Я работаю над (существующего) Дженкинс плагин и хотел бы использовать инъекции зависимостей. К сожалению, DI для развития Дженкинс плохо документированы. Насколько я знаю, Дженкинс использует рамку Guice компании Google для DI. Существует эта вики-страницы, но я немного озадачен об этом: в существующих Jenkins плагинов, которые я проверил, я не вижу таких звонков на Guice, но я вижу много применений аннотацию @Inject. Futhermore, это беспокоит меня, что я должен был бы назвать Guice.createInjector (новый MyModule ()) injectMembers (это). внутри каждого класса, где я хочу инъекции зависимостей, похоже, я засоряя свой код. Как делать инъекции зависимостей в Дженкинс? Например, у меня есть простой интерфейс «MyInterface» и реализующий класс MyInterfaceImpl. В третьем классе у меня есть следующие: класс MyClass {частное MyInterface OBJ; @Inject общественной MyClass (MyInterface OBJ) {this.obj = OBJ; } ...} Существует ли механизм в Дженкинс автоматически строить такие объекты, или я должен добавить, что Guice код инжектора?
Boon
1

голосов
0

ответ
132

Просмотры

Registering and consuming single instance with various dependencies with Autofac in ASP.NET application

Я хочу иметь один экземпляр WorkerContainer класса, который вводит различные реализации рабочих. Я хочу, чтобы получить этот экземпляр в Global.asax и начать рабочий. общественного класса WorkerContainer {IWorker [] _workers; общественного WorkerContainer (IWorker [] рабочие) // DI {_workers = рабочие; } общественный недействительный StartWorkers () {Еогеасп (IWorker Вт в _workers) {w.Start (); }}} Каждая реализация работника может привнести некоторые услуги, зарегистрированные «InstancePerRequest». Это часть моего кода IoCConfig: // некоторые службы, которые я использую в контроллерах WebAPI // а также в WatchersWorker builder.RegisterType () .AsSelf () InstancePerRequest ();. builder.RegisterType () .Как () InstancePerLifetimeScope ();. // реализация один рабочий builder.RegisterType () SingleInstance (). Тогда я пытаюсь получить, что один экземпляр. Я не могу найти метод Resolve из контейнера, только ResolveComponent, что я не знаю, как использовать. WorkerContainer workerContainer = DependencyResolver.Current.GetService (); При такой конфигурации я получаю эту ошибку:. «Нет сферы с совпадающим Tag„AutofacWebRequest“видно из сферы, в которой испрашивается экземпляр Как правило, это указывает на то, что компонент зарегистрирован как за HTTP запрос запрашивается с помощью SingleInstance () компонент (или подобный сценарий.) в веб-интеграции всегда запрашивать зависимости от DependencyResolver.Current или ILifetimeScopeProvider.RequestLifetime, никогда от самого контейнера.»Я знаю, что эта конфигурация не хорошо, и не будет работать,
vpetrovic
1

голосов
2

ответ
110

Просмотры

Общий код для инъекции зависимостей для веб-апи, панели администратора и MVC контроллер

В настоящее время, у меня ниже 4-х проектов в моем файле решения: API (Web API) Web (MVC) Администратор (MVC) Service Layer (C # библиотека) Уровень сервиса используются всеми 3 веб-проектов. Службы вводится с помощью Autofac контейнера. Услуги регистрируются в каждом из веб-проектов во время запуска, которая вызывает дублирование кода. Есть более простой способ, где я могу зарегистрировать все зависимости в одном месте, так что он может быть повторно использован всеми проектами? Любая помощь высоко ценится.
user3151766
1

голосов
0

ответ
121

Просмотры

Как делать инъекции зависимостей в ViewController, состоявшемся в moreNavigationController UITabBarController в?

У меня есть приложение с его основной вид будучи UITabBarController подкласс, который содержит NSPersistentContainer. Некоторые из UIView подклассов в TabBarController подарки должны иметь доступ к NSPersistentContainer. Эти UIView подклассов в основном встроены в UINavigationControllers. Для того, чтобы сделать его легко проверить, какой нужен был NSPersistentContainer, я создал протокол под названием NeedsContainer и сделал соответствующие UIView подклассов соответствуют этому. Я хватаю ViewController в Func tabBarController (_ tabBarController: UITabBarController, didSelect ViewController: UIViewController) {Проверяем, если его UINavigationController, если я попрошу его .topViewController и проверить, если это соответствует NeedsContainer. Если это так, то я впрыснуть NSPersistentContainer. Это прекрасно работает до тех пор, ... теперь у меня есть больше сцен, чем помещается на TabBar overspilling в moreNavigationController. Вот код, завалены заявлениями для печати, чтобы помочь мне отлаживать, что происходит на Func tabBarController (_ tabBarController: UITabBarController, didSelect ViewController: UIViewController) {Print ( "выбрано \ ntab ************** ************************** ") печать (" ViewController является тип: \ (тип (из: ViewController)) ") печать (" * ************************************************** * "), если viewController.isKind (из: UINavigationController.self) {Print (" вспашки через "), если пусть NavController = ViewController, как? UINavigationController {печать ( "** это пусть пусть NavController = ViewController, как? UINavigationController" ), Если переменная actualViewController = navController.topViewController! как? NeedsContainer {печать ( "контроллер actualView вроде: \ (тип (из: actualViewController))") actualViewController.container = контейнер для печати ( "передается в контейнер")} еще {печать ( "Его не NeedsContainer, его \ ( тип (из: navController.topViewController)) «)}} еще {печать (» оно не позволить NavController = ViewController, как UINavigationController «)}}}` При нажатии на одну из опций в moreNavigationController запускает сцену, но не впрыскивать? NSPersistentContainer. Heres выход, когда я выбираю больше кнопки в TabBar ... выбранная вкладка **************************************** ViewController является тип: UIMoreNavigationController *** ************************************************* вспашка через ** это пусть пусть NavController = ViewController, как? UINavigationController его не NeedsContainer, сво Дополнительно При нажатии на одну из опций в moreNavigationcontroller, ничего не выводится на консоль. Xcode падает на проверки, что упорная контейнер является ноль в новой сцене. Таким образом, я обнаружил ... The .moreViewController на самом деле типа UIMoreNavigationController. UIMoreNavigationController это недокументированная, но должен быть подклассом UINavigationController, потому что мой код пахали на через в чеке. Xcode будет бросать ошибки в попытке обратиться к UIMoreNaviagtionController, так что вы не можете спросить, если что-то в этом роде. При нажатии на ячейку в moreNavigationContoller по-видимому, не вызывает функ tabBarController (_ tabBarController: UITabBarController, didSelect ViewController: UIViewController) Итак, как я впрыснуть NSPersistentContainer от Опцион Thats оказался на moreNavigationController? В качестве временного решения, но не ответ на мой вопрос, я понял, в то время как это пишет, что классы, которые нуждаются в NSPersistentContainer мог получить доступ к их собственности .tabBarController и уходит в него и захватить persistentContainer. Это работает, я пробовал, но мне кажется, неправильный подход по сравнению с инъекционной зависимостью от моего UITabBarController подкласса. как я впрыснуть NSPersistentContainer от Опцион Thats заканчивали на moreNavigationController? В качестве временного решения, но не ответ на мой вопрос, я понял, в то время как это пишет, что классы, которые нуждаются в NSPersistentContainer мог получить доступ к их собственности .tabBarController и уходит в него и захватить persistentContainer. Это работает, я пробовал, но мне кажется, неправильный подход по сравнению с инъекционной зависимостью от моего UITabBarController подкласса. как я впрыснуть NSPersistentContainer от Опцион Thats заканчивали на moreNavigationController? В качестве временного решения, но не ответ на мой вопрос, я понял, в то время как это пишет, что классы, которые нуждаются в NSPersistentContainer мог получить доступ к их собственности .tabBarController и уходит в него и захватить persistentContainer. Это работает, я пробовал, но мне кажется, неправильный подход по сравнению с инъекционной зависимостью от моего UITabBarController подкласса.
SimonTheDiver
1

голосов
1

ответ
78

Просмотры

Дразнящий класс конкретизируется в другом классе в Magento

Я стараюсь, чтобы узнать больше о тестировании, но, к сожалению, я должен сделать это в Magento 1.9. * :) Рассмотрим следующий код (GDPR родственный) ... класс Vendor_Module_Helper_Data {общественная функция __construct () {$ this-> конфигурации = Mage :: помощник ( 'vendor_module / конфигурации'); } общественная функция anonymizeEmail (Mage_Customer_Model_Customer $ клиент) {возвращение preg_replace_callback ( '# {([а-г _] *)} #', функция (соответствует $) использования ($ клиент) {возвращение strtolower ($ на клиента> GetData ($ матчи [1]));}, $ этом-> config-> getEmailFormat ()); }} Класс Vendor_Module_Helper_Config {общественная функция getEmailFormat () {вернуть Mage :: getStoreConfig ( 'vendor_module / электронная почта / формат)); }} I» пишу тест, который утверждает, что данный клиент электронной отформатирован в правильном пути, как это: общественная функция it_anonymizes_customer_email () {$ клиента = Mage :: getModel ( «клиент / заказчик) -> setEntityId (1) -> setFirstname ( 'Клиент') -> setLastname ( 'Anonymous'); $ ConfigStub = $ this-> createMock (Vendor_Module_Helper_Config :: класс); $ ConfigStub-> метод ( 'getEmailFormat') -> willReturn ( 'клиент {ENTITY_ID} @ anonymo.us.'); $ Электронная почта = Mage :: помощник ( 'vendor_module') -> anonymizeEmail ($ клиент); $ This-> assertEquals ($ электронной почты, '[email protected]'); } Конечно, это не будет работать, как есть, но это должно быть ясно, что я пытаюсь достичь здесь ... Мой вопрос заключается в том, чтобы сделать эту работу лучше без использования DI, что Magento не хватает. Есть ли способ, чтобы дразнить класс, который конкретизируется (защищенный) в конструкторе другого класса? Это лучшая практика? Или это было бы правильным решением: класс Vendor_Module_Helper_Data {общественная функция __construct ($ арг) {$ this-> конфигурации = Исеть ($ арг [ 'конфигурации'] $ арг [ 'конфигурации']: Mage :: помощник ( 'vendor_module / конфигурации ');}} И затем в тест: $ электронной почте = Mage :: хелперов (' vendor_module», [ 'конфигурации' => $ configStub]) -> anonymizeEmail ($ клиент), я должен был бы изменить класс от Helper к модели, так как помощник не принимает конструктор Params (я думаю). Некоторые советы будут оценены! Есть ли способ, чтобы дразнить класс, который конкретизируется (защищенный) в конструкторе другого класса? Это лучшая практика? Или это было бы правильным решением: класс Vendor_Module_Helper_Data {общественная функция __construct ($ арг) {$ this-> конфигурации = Исеть ($ арг [ 'конфигурации'] $ арг [ 'конфигурации']: Mage :: помощник ( 'vendor_module / конфигурации ');}} И затем в тест: $ электронной почте = Mage :: хелперов (' vendor_module», [ 'конфигурации' => $ configStub]) -> anonymizeEmail ($ клиент), я должен был бы изменить класс от Helper к модели, так как помощник не принимает конструктор Params (я думаю). Некоторые советы будут оценены! Есть ли способ, чтобы дразнить класс, который конкретизируется (защищенный) в конструкторе другого класса? Это лучшая практика? Или это было бы правильным решением: класс Vendor_Module_Helper_Data {общественная функция __construct ($ арг) {$ this-> конфигурации = Исеть ($ арг [ 'конфигурации'] $ арг [ 'конфигурации']: Mage :: помощник ( 'vendor_module / конфигурации ');}} И затем в тест: $ электронной почте = Mage :: хелперов (' vendor_module», [ 'конфигурации' => $ configStub]) -> anonymizeEmail ($ клиент), я должен был бы изменить класс от Helper к модели, так как помощник не принимает конструктор Params (я думаю). Некоторые советы будут оценены! Я бы изменить класс от Helper к модели, так как помощник не принимает конструктор Params (я думаю). Некоторые советы будут оценены! Я бы изменить класс от Helper к модели, так как помощник не принимает конструктор Params (я думаю). Некоторые советы будут оценены!
Maarten Troonbeeckx
1

голосов
0

ответ
91

Просмотры

Как сломать длинную autowire исключить Glob

У меня есть следующие строки в services.yml: Услуги: _defaults: autowire: истинный AUTOCONFIGURE ложь AppBundle \ CompanyInfo \: ресурс: '../../../src/AppBundle/CompanyInfo/*' # TODO: Найти, как разорвать эту линию. исключить:»../../../src/AppBundle/CompanyInfo/**/{Company.php,CompanyAddress.php,MultipleCompanyAttributesParserDecorator.php,Executive.php,Person.php,ForeignCompanyFounder.php,PersonFounder.php, RussianCompanyFounder.php, EconomicActivity.php, EconomicActivityInfo.php}»Как я могу разбить исключить Glob на несколько строк? Мне нужно что-то вроде этого (не работает): исключить:> ../../../src/AppBundle/CompanyInfo/**/{Company.php, CompanyAddress.php, MultipleCompanyAttributesParserDecorator.php, Executive.php, Person.php, ForeignCompanyFounder.php,
peresmeshnik
1

голосов
1

ответ
55

Просмотры

Как я могу решить мою проблему, связанные с Беспараметрическим конструктором при использовании дженерик с ограничением определенных

У меня есть класс, который я пытаюсь создать инъекции зависимостей для в моем файле StartUp.cs, как этот services.AddTransient (); Я также стараюсь передать в IContextFactory в конструктор, как этот общественный BlogPostRepository (IContextFactory blogPostContext), но я получаю ошибки на линиях выше о том, что «BlogPostContext» должен быть не абстрактный тип с конструктором публичного без параметров для того, чтобы использовать его в качестве Параметр «T» в общем типе или методе «IContextFactory» Я не уверен, почему, потому что я использую новый T () в качестве ограничения в моем интерфейсе декларации. Вот класс, я пытаюсь создать экземпляр открытого класса BlogPostContext {частного IMongoDatabase _mongoDatabase только для чтения; частное чтение IMongoClient _mongoClient; общественный IMongoCollection BlogPostModelCollection => _mongoDatabase. GetCollection ( "BlogPostModel"); общественного BlogPostContext (IMongoDatabase mongoDatabase, настройки IOptions) {_mongoDatabase = mongoDatabase; _mongoClient = новый MongoClient (settings.Value.ConnectionString); если (нуль = _mongoDatabase!) _mongoDatabase = _mongoClient.GetDatabase (settings.Value.Database); }} Общий интерфейс и это конкретное пространство имен реализации FloormindCore.Blog.Factory {общедоступный интерфейс IContextFactory где T: новый () {T Create (); }} С помощью системы; Пространство имен FloormindCore.Blog.Factory {класс ContextFactory общественности: IContextFactory где T: новый () {общественного T Create () {возвращение (T) Activator.CreateInstance (TypeOf (T)); }}} общественного BlogPostContext (IMongoDatabase mongoDatabase, настройки IOptions) {_mongoDatabase = mongoDatabase; _mongoClient = новый MongoClient (settings.Value.ConnectionString); если (нуль = _mongoDatabase!) _mongoDatabase = _mongoClient.GetDatabase (settings.Value.Database); }} Общий интерфейс и это конкретное пространство имен реализации FloormindCore.Blog.Factory {общедоступный интерфейс IContextFactory где T: новый () {T Create (); }} С помощью системы; Пространство имен FloormindCore.Blog.Factory {класс ContextFactory общественности: IContextFactory где T: новый () {общественного T Create () {возвращение (T) Activator.CreateInstance (TypeOf (T)); }}} общественного BlogPostContext (IMongoDatabase mongoDatabase, настройки IOptions) {_mongoDatabase = mongoDatabase; _mongoClient = новый MongoClient (settings.Value.ConnectionString); если (нуль = _mongoDatabase!) _mongoDatabase = _mongoClient.GetDatabase (settings.Value.Database); }} Общий интерфейс и это конкретное пространство имен реализации FloormindCore.Blog.Factory {общедоступный интерфейс IContextFactory где T: новый () {T Create (); }} С помощью системы; Пространство имен FloormindCore.Blog.Factory {класс ContextFactory общественности: IContextFactory где T: новый () {общественного T Create () {возвращение (T) Activator.CreateInstance (TypeOf (T)); }}} Value.ConnectionString); если (нуль = _mongoDatabase!) _mongoDatabase = _mongoClient.GetDatabase (settings.Value.Database); }} Общий интерфейс и это конкретное пространство имен реализации FloormindCore.Blog.Factory {общедоступный интерфейс IContextFactory где T: новый () {T Create (); }} С помощью системы; Пространство имен FloormindCore.Blog.Factory {класс ContextFactory общественности: IContextFactory где T: новый () {общественного T Create () {возвращение (T) Activator.CreateInstance (TypeOf (T)); }}} Value.ConnectionString); если (нуль = _mongoDatabase!) _mongoDatabase = _mongoClient.GetDatabase (settings.Value.Database); }} Общий интерфейс и это конкретное пространство имен реализации FloormindCore.Blog.Factory {общедоступный интерфейс IContextFactory где T: новый () {T Create (); }} С помощью системы; Пространство имен FloormindCore.Blog.Factory {класс ContextFactory общественности: IContextFactory где T: новый () {общественного T Create () {возвращение (T) Activator.CreateInstance (TypeOf (T)); }}} Новый () {T Create (); }} С помощью системы; Пространство имен FloormindCore.Blog.Factory {класс ContextFactory общественности: IContextFactory где T: новый () {общественного T Create () {возвращение (T) Activator.CreateInstance (TypeOf (T)); }}} Новый () {T Create (); }} С помощью системы; Пространство имен FloormindCore.Blog.Factory {класс ContextFactory общественности: IContextFactory где T: новый () {общественного T Create () {возвращение (T) Activator.CreateInstance (TypeOf (T)); }}}
ife labolz
1

голосов
1

ответ
199

Просмотры

Spring ConflictingBeanDefinitionException конфликты с существующим, несовместимым определением боба того же имени и класса

Я сталкиваюсь такая же проблема, как это. Я знаю, как решить эту проблему, но я не знаю, почему это происходит. Как это уже упоминалось, по умолчанию инъекции весной по типу, а не по имени. Вот почему мы можем привнести реализацию в интерфейс. В моем весеннем веб-приложение, я инъекционного соответствующий интерфейс, при решении по типу, он должен найти точный конкретный класс, но я сталкиваюсь исключение ConflictingBeanDefinitionException: интерфейс A; Интерфейс В; Класс com.level1.Child реализует А; Класс com.level2.Child реализует B; @Autowired личное B B; // Ожидая com.level2.Child очевидно! Как так? Любой лучший способ решить эту проблему? Это очень раздражает, потому что мне нужно аннотировать Классификатор на много переменных, из-за их много имени того же класса в разных пакетах моего приложения.
GMsoF
1

голосов
1

ответ
100

Просмотры

Когда следует использовать Scoped в .netcore API?

Когда WebAPI обрабатывает запрос, он использует AsyncLocal- значение, все одноэлементные в контейнере находятся в области видимости на запрос неявно. В какой ситуации вы бы зарегистрировать контекстную услугу?
micah
1

голосов
1

ответ
41

Просмотры

используя @Qualifier + @Bean (autowire = Autowire.BY_TYPE) в javaConfig

У меня есть компонент сотрудника, имеющего тип адреса зависимости. Я пытаюсь настроить в javaConfig автоматического связывания. Но получение NoQualifyingBeanException. Хотя я использую @Qualifier аннотации () следующим образом: @Configuration общественного класса MyConfig {@Bean (имя = "addr1") публичный адрес адрес () {вернуть новый адрес ( "Hello", "привет", 112233); } @Bean (имя = "адрес") публичный адрес addressAgain () {вернуть новый адрес ( "See You", "Bi", 114422); } @Bean (имя = "эми", autowire = Autowire.BY_TYPE) @Qualifier ( "addr1") сотрудник государственного служащего () {Сотрудник е = новый сотрудник (); e.setName ( "Рагх"); e.setEmpID (111); //e.setAddress (адрес ()); вернуться е; }}
user1257846
1

голосов
0

ответ
50

Просмотры

Продолжение действия запроса после запроса завершено

У меня возникли проблемы с поиском окончательного подхода к достижению следующей цели. У нас есть хорошая реализация для запроса вызова операции области действия от клиента. Эти операции, как ожидается, быстрый и ловкий, т.е. ключ = entry.getKey (); Связывание связывания = entry.getValue (); если (binding.acceptScopingVisitor (IS_REQUEST_SCOPED)) {requestScopedValues.put (ключ, binding.getProvider ()); }}} Частное окончательное BindingScopingVisitor IS_REQUEST_SCOPED = новый BindingScopingVisitor () {@Override общественного Логическое visitScopeAnnotation (класс, Provider> запись: requestScopedValues.entrySet (!))... {Если (entry.getKey () getTypeLiteral () getRawType () IsAssignableFrom (HttpServletRequest.class) &&! entry.getKey (). getTypeLiteral (). getRawType (). !.... IsAssignableFrom (HttpServletResponse.class) && entry.getKey () getTypeLiteral () getRawType () IsAssignableFrom (Map.class)) seedMap.put (entry.getKey (), entry.getValue () получаем ()); }} Поймать (Exception е) {Logger.log (Level.SEVERE, «не может добавить запрос совладать значения в карте семян для продолжения запроса сферы», е); певд AltAppOpsException ( «не удалось добавить запрос совладать значения в карте семян для продолжения запроса сферы»); } Вернуть ServletScopes.scopeRequest (вызываемая, seedMap); }}
Gautam
1

голосов
2

ответ
883

Просмотры

Autowire not working in Symfony's Dependency Injection component

Я использую Symfony Dependency Injection в компонент версии 3.4 в моем пользовательских PHP проекта. Мой проект работает на PHP 5.6 «Symfony / зависимости инъекции»: «^ 3,4» Я определил мой файл services.yaml содержать следующие определения услуг регистратора: класс: аргументы Монолога \ Logger: [ «приложение»] autowire: истинные общественной : верно Монолог \ Logger: «@logger» plugin_context: класс: MyProject \ PluginContext autowire: истинная публика: правда, я могу подтвердить, что самозарядные работает и экземпляр обоих классов присутствуют в определении, но класс Logger не autowired в PluginContext конструктору. класс определяется следующим использованием кода Монолог \ Logger; класс PluginContext {частный $ логгер; Функция __construct (регистратор $ регистратор) {$ этом-> Регистратор = $ регистратор; }} Когда следующий код запускается, PHP генерирует исключение $ container-> получить ( "plugin_context"); Catchable фатальная ошибка: Аргумент 1 передается MyProject \ PluginContext :: __ конструкт () должен быть экземпляром Монолог \ Logger, никто не дал
Nisar Ahmed
1

голосов
1

ответ
20

Просмотры

Dependency inject Class with class methods

У меня есть класс, который имеет только методы класса //FileManager.h + (аннулируются) WriteData: (NSData *) данные toFile: (NSString *) Filepath; // ... // еще несколько методов класса Я использую этот класс внутри другого одного //AttachmentsRepository.m - (Недействительными) newAttachment: (NSData *) attachmentData {// некоторый код NSString * generatedPath = @ "/ некоторые / полученные / дорожка"; [FileManager WriteData: attachmentData toFile: generatedPath]; } Теперь я пишу тесты для AttachmentRepository и было интересно, как придать FileManager. Что я использую это "экстракт и переопределения вызова" метод: //AttachmentsRepository.m - (Недействительными) newAttachment: (NSData *) attachmentData {// некоторый код NSString * generatedPath = @ "/ некоторые / сгенерированного / путь"; [[Само] getFileManagerClass WriteData: attachmentData toFile: generatedPath]; } - (класс) getFileManagerClass {вернуться [класс FileManager]; } Теперь в моем тесте я просто гашу getFileManagerClass вернуться [FakeFileManager класс] Что является лучшим решением? Это унаследованный код, но позволяет сказать, что мы пишем сейчас. Как FileManager зависимость должна быть реализована. PS. Я хочу использовать подделку, потому что я хотел бы избежать записи на диск при тестировании класса AttachmentRepository.
h3dkandi
1

голосов
0

ответ
32

Просмотры

Зависимость Разрешение в Swagger Startup

Я пытаюсь решить объект, который реализует интерфейс IMyConfiguration при запуске Swagger. Это можно сделать с помощью следующего фрагмента кода: общественного класса SwaggerConfig {государственной статической силы Register () {вар MyConfig = GlobalConfiguration.Configuration.DependencyResolver.GetService (TypeOf (IMyConfiguration)); GlobalConfiguration.Configuration.EnableSwagger (с => {...}); }} Конечно, вы должны убедиться, что контейнер инициализируется перед Кураж регистрирует себя для этой работы. Я задаюсь вопросом, есть ли возможный способ сделать разрешение зависимостей другим способом, или что я буду жить с этим.
Chrono
1

голосов
0

ответ
66

Просмотры

Промежуточное перед тем Модель инъекции

У меня есть дизайн сомнения, я хотел бы поделиться. У меня есть модель в Laravel с наблюдателем в извлеченной: класс MailingObserver {общественная функция извлекаться ($ рассылки) {// извлекаем содержимое HTML с диска файл $ mailing-> SetAttribute ( «содержание», \ Осветите \ Support \ \ Storage Фасады :: диска ( 'рассылки') -> получить ( "{$ mailing-> идентификатор} - {$ mailing-> пробкового} .html")); $ Mailing-> syncOriginal (); }}, Которые получить атрибут хранится в виде обычного текста, а не базы данных. Сайт является мультибрендовой платформой так диск ( «рассылка») отличается по каждому вошедшему пользователю. Эта конфигурация загружаются в промежуточном программном обеспечении в соответствии с текущим вошедшим пользователем. До здесь все в порядке. Теперь «проблема». У меня есть контроллер, который впрыскивает в сущности рассылку: Класс MailingCrudController расширяет CrudController {/ ** * Отправляет тариф * @param запрос $ запроса * @param \ App \ Почтовый $ рассылка * / общественная функция отправки (запрос $ запроса, \ App \ $ Почтовый рассылки) {// WHATEVER}} Когда модель вводятся извлеченный метод наблюдателя обжигает но Промежуточная не было до сих пор выполняется так рассылки диск все еще не установлен. Я не знаю, как изменить этот порядок: сначала необходимо выполнить middleare, затем инъекции модели. Один из подходов, я попытался в AppServiceProvider добавить: класс AppServiceProvider расширяет ServiceProvider {/ ** * Bootstrap любые прикладные услуги. * * * @Return пустоты / загрузки общественной функции () {$ = новый промежуточного слой \ App \ Http \ Middleware \ CheckBrandHost (); $ Middleware-> setBrandInformation (запрос ()); $ Middleware-> loadBrandConfig (запрос () -> получить ( 'brand.code_name')); } Вы бы одобрить это решение? Какие проблемы могут привести к его мне? Является ли это правильный способ сделать это? Спасибо всем!
splig
1

голосов
0

ответ
31

Просмотры

Угловая Dependency Injection родительского экземпляра

У меня есть рабочий пример индивидуальных аккордеонов материала https://stackblitz.com/edit/angular-imnpaf?file=src%2Fapp%2Faccordion-item.component.ts Он хорошо работает. Единственный вопрос, который я имею, когда я впрыснуть AccordionDirective в AccordionItemComponent, как угловатый знает, что, в частности, мне нужен экземпляр родительского AccordionDirective и правильно дает мне этот экземпляр? Upd В CdkAccordionItem есть _expansionDispatcher, который срабатывает каждый раз, когда аккордеон элемент расширяется так будет свернуто остальные пункты этого аккордеона. И есть проверка состояния this.accordion.id === accordionId, что каждый элемент принадлежит к тому же аккордеону, где было произошедшим событие. Я просто не могу понять, как сделать каждый элемент получает его это. баян? Я имею в виду, почему, если я просто импортировать класс из AccordionDirective в моем AccordionItemComponent и придать ей - на самом деле это дает именно родительский экземпляр AccordionDirective (а не только первый или последний или любой случайный экземпляр любого другого аккордеона в этом приложении)?
Dmitry
1

голосов
0

ответ
248

Просмотры

AutoMapperMappingException: Невозможно создать экземпляр типа .netcore

Im используя карту Structure, как мой ди-контейнер в ядре ASP.NET и когда я хочу, чтобы решить некоторые услуги в некотором automapper распознавателя как следующее: открытый класс UserRolesResolver: IValueResolver {частный AppUserManager _appUserManager только для чтения; общественного UserRolesResolver (AppUserManager appUserManager) {_appUserManager = appUserManager; } Список Resolve общественности (источник пользователя, CurrentUserVeiwModel назначения, список destMember, ResolutionContext контекст) {destination.Roles = AsyncHelpers.RunSync (() => _appUserManager.GetRolesAsync (источник)) ToList (). вернуться destination.Roles; }} Что я получил это AutoMapperMappingException: Не удается создать экземпляр типа AutomapperProfiles.UserRolesResolver я также сконфигурированный automapper в классе запуска, как это: services.AddAutoMapper (х => {X.AddProfiles (Assembly.GetAssembly (TypeOf (OrderProfile))); x.ConstructServicesUsing (тип => ServiceProvider.GetRequiredService (тип)); });
1

голосов
0

ответ
39

Просмотры

Guice provider based on injected class

Я пытаюсь вводить объект в конструктор класса, который создается на основе нераспределенных аннотаций нагнетаемого класса. Я могу создать сам объект просто достаточно с провайдером, но мне нужно, чтобы получить класс, который в настоящее время введен. Абстрактный MyClass и базовая реализация MyClassImpl: общественный абстрактный класс MyClass {} // игнорируя конструктор @Annotation ( "значение") общественный класс MyClassImpl расширяет MyClass {@Inject частное MyClass (MyService сервис, объект MyObject) {супер (обслуживание, объект) ; }} Услуга предоставления экземпляров и содержащие Injector: общественный класс MyService {личного окончательного Injector инжектор; общественных Т деЫпзЬапс (класс clazz) {вернуть injector.getInstance (clazz); }} Моя цель состоит в том, чтобы настроить модуль таким образом, чтобы можно впрыснуть экземпляр MyObject, который создается с использованием информации из аннотации, такие как имеющий идентификатор будет значение в приведенном выше примере. Схематичный решение сохранить класс в настоящее время вводят в качестве переменной в MyService. Модуль создан в конструкторе, так что я могу получить его от и это должно удовлетворить мои потребности достаточно хорошо. Тем не менее, я думаю, что было бы каким-то образом, чтобы получить класс в настоящее время впрыскивается. Спасибо! Я думаю, что было бы каким-то образом, чтобы получить класс в настоящее время впрыскивается. Спасибо! Я думаю, что было бы каким-то образом, чтобы получить класс в настоящее время впрыскивается. Спасибо!
Jay Castell
1

голосов
0

ответ
243

Просмотры

Инъекции ¯hk2 зависимость для dropwizard App Java

Я имею два dropwizard Java приложения в два модуля. Скажем А и В, и наш B Модуль зависит от А. Теперь я хочу, чтобы ввести другой клиент в двух различных ситуациях, то есть один, когда A в dropwizard перспективе и другие, когда dropwizard бежать Б. Пусть Myclass находится в модуле: открытый класс MyClass {@Inject частный конечный клиент CustomClient; } Я хочу сделать это с помощью инъекции HK2 зависимостей. Класс Примечания Myclass не класс ресурсов ... В настоящее время я зарегистрировал другую реализацию для CustomClient в моей App модуля B, как это:. environment.jersey () регистр (новый AbstractBinder () {@Override защищена недействительная Configure () { ... связывания (новый MyCustomClient ()) к (CustomClient.class);. ...}}); Но когда я запустить приложение В, и вызов класса MyClass А от него я получаю нуль для CustomClient Класса MyClass в модуле А. Но я думал я получить экземпляр MyCustomClient после получения инъекции. Как я могу добиться того, что я хочу с ¯hk2 DI? Примечание: Я хочу сделать инъекцию в обычном классе Java с HK2.
Ayush Mishra
1

голосов
1

ответ
82

Просмотры

Обновление кэша Dependency Injection

Я новичок в разработке в C # так еще выяснить несколько вещей. Я пытаюсь придерживаться хороших дизайнерских принципалов, чтобы держать мой код обслуживаемыми. Так что делать я строю линии бизнес-приложения, используя шаблоны MVVM и Factory. Я также использую Dependency Injection (Unity). Мой вопрос о обновлении кэша данных, созданный с помощью Dependency Injection. Когда я создаю мой взгляд, модель кэш данных загружается следующим образом: _container.RegisterType (новый TransientLifetimeManager ()); Мой сценарий является то, что у меня есть данные, представленные пользователям в GridView. У меня есть многопользовательская среда с динамической информацией, так что возможно, что время от времени данных в кэш устаревает. Это может привести, как и следовало ожидать, в ошибках DBConcurrency времени от времени. То, что я борюсь с, как справиться с этим в правильном порядке. Должен ли я прервать весь процесс и есть пользователь перезагрузить приложение, таким образом, воссоздавая DI или есть элегантный способ обновить кэш и повторно присутствуют данные после предоставления необходимой информации для пользователя. Используя 2n'd варианта я мог бы, возможно, разместить кнопку обновления на экране или приурочено событие, чтобы обновить данные, чтобы пользователь мог видеть какие-либо изменения в данных. Поэтому в основном то, что я спрашиваю, как я могу держать кэш в синхронизации с базовой базой данных в режиме реального времени? Заранее спасибо. вариант d я мог бы, возможно, разместить кнопку обновления на экране или приурочено событие, чтобы обновить данные, чтобы пользователь мог видеть какие-либо изменения в данных. Поэтому в основном то, что я спрашиваю, как я могу держать кэш в синхронизации с базовой базой данных в режиме реального времени? Заранее спасибо. вариант d я мог бы, возможно, разместить кнопку обновления на экране или приурочено событие, чтобы обновить данные, чтобы пользователь мог видеть какие-либо изменения в данных. Поэтому в основном то, что я спрашиваю, как я могу держать кэш в синхронизации с базовой базой данных в режиме реального времени? Заранее спасибо.
Tony
0

голосов
0

ответ
4

Просмотры

Как проверить блок угловой компонент создан с ngComponentOutlet?

У меня есть компонент, созданный с помощью ngComponentOutlet и самого компонента импорта {Component, OnInit, инъекционные, EventEmitter} от '@ угловой / ядра'; импорт {} Данные из '@ угловой / маршрутизатора; @Injectable () экспорт класса AdminTableInfo {resourceData; ResourceConfiguration; ResourceName; Конструктор (resourceData, ResourceConfiguration, ResourceName) {this.resourceData = resourceData; this.resourceConfiguration = ResourceConfiguration; this.resourceName = ResourceName; }} @Component ({селектор: 'RW-администратор-таблица', templateUrl: './admin-table.component.html', styleUrls: [»./admin-table.component.scss']}) экспорта класса AdminTableComponent реализует OnInit {частные _resourceData; Конструктор (публичное adminTableInfo: AdminTableInfo) {если (adminTableInfo) {это. _resourceData = adminTableInfo.resourceData; }} NgOnInit () {this.setTableStyle (); this.setDefaultSort (); this.adminTableInfo.resourceDataChanged $ .subscribe (данные => {this._resourceData = данные; this.setDefaultSort ();}); } ... Как я настроить блок-тест? мы используем шутя, но я думаю, что набор вверх должен быть очень похож на жасмин / Кармы Это мой блок тест до сих пор @Injectable () экспорт класса AdminTableInfo {resourceData; ResourceConfiguration; ResourceName; Конструктор (resourceData, ResourceConfiguration, ResourceName) {this.resourceData = resourceData; this.resourceConfiguration = ResourceConfiguration; this.resourceName = ResourceName; }} Описывают ( 'AdminTableComponent', () => {пусть компонент: AdminTableComponent; пусть приспособление: ComponentFixture; пусть fakeAdminTableInfo: AdminTableInfo; beforeEach (асинхронной (() => {MockConfiguration .getAdminTestBedConfiguration () {.configureTestingModule (заявления: [AdminTableComponent, AdminTableRowComponent,], провайдеры: [AdminTableInfo]}) .compileComponents ();})); beforeEach (() => {арматура = TestBed.createComponent (AdminTableComponent); компонент = fixture.componentInstance; // Не уверен, что мне нужно создать экземпляр, как это инъекционной fakeAdminTableInfo = fixture.debugElement.injector.get (AdminTableInfo); fixture.detectChanges ();}); она ( 'должна создать', () => {ожидать (компонент) .toBeTruthy ();}); }); Я получаешь NThe сообщение об ошибке: Не удается разрешить все параметры AdminTableInfo: (,??). что означает, я не инъекционный AdminTableInfo при создании компонента. Кто-нибудь знает, как настроить модульное тестирование для такого случая?
FraPetIm
1

голосов
0

ответ
34

Просмотры

Как придать зависимости в динамический список объектов в угловом-

У меня есть список объектов, которые могут изменяться динамически. Как я могу привнести зависимости в эти объекты? Если бы они были компоненты (созданные с помощью * ngFor), то @Inject (...) на конструктор работает из коробки. Но я не нужны эти объекты появляются в DOM. Так что я могу, например, получить список экземпляров службы вместо экземпляров компонентов из списка объектов (по аналогии с * ngFor, но за услуги)? Например, я хочу, чтобы компонент игры для запуска обновления () на каждом объекте пункта: @Component селектора: «приложение-игра», templateUrl: «./game.component.html», styleUrls: [»./game.component. CSS']}) экспорт класс GameComponent {частные пункты: Пункт [] = [... // только некоторые произвольные данные испытаний на данный момент]; ... частное обновление () {для (п элементов) {item.update (); // хотите запустить определенную логику для каждого элемента}}} Однако для реализации item.update (), я должен был бы впрыснуть DatabaseService, который я не могу, потому что элемент списка не управляемый Угловое. Я мог бы вместо того, чтобы реализовать функцию обновления в другом классе обслуживания, но тогда функция обновления будет требовать ссылки на элемент, например: модифицировано обновление GameComponent () функция: частное обновление () {для (пункта пунктов) {itemService.update ( вещь); // хочет запустить некоторую логику по каждому пункту}} Функции обновления () класса Item будет перенесено в ItemService: @Injectable ({providedIn: 'корень'}) экспорт класс ItemService {конструктор (@Inject (DatabaseService) частной дб: DatabaseService) {} обновление (пункт: Пункт) {... // реализация переехал сюда}} Это работает, но если я собираюсь реализовать гораздо больше функций в классе Item в будущем, я считаю эту модель не так объектно-ориентированным языком, например, я не могу наследовать класс Item и переопределить обновления функция (). Есть ли лучшее решение?
Vincentius Kevin
1

голосов
0

ответ
63

Просмотры

Spring Управляемый валидатора не используется от конечной точки

Я был на этом какое-то время, но у меня есть Spring удались пользовательским валидатор, который выглядит как ниже, у меня есть некоторые операторы печати, в которых есть я доберусь до позже @Component общественного класса BulkUpdateValidator реализует ConstraintValidator {@Autowired ObjectMapper картографа ; общественного BulkUpdateValidator () {System.out.println (this.toString ()); } @PostConstruct общественного недействительными после () {System.out.println (преобразователь); System.out.println (this.toString ()); } Общественного логический IsValid (BulkUpdate обновление, ConstraintValidatorContext контекст) {System.out.println (this.toString ()); System.out.println (преобразователь); } ... другие методы валидатор ...} Мой метод управления: (Примечание: мой класс контроллера с аннотацией @Validated в верхней) @RequestMapping (... ) Общественного @ResponseBody RestResponse bulkUpdate (@Valid @ValidBulkUpdate Bulkupdate bulkUpdate) {... материал здесь ...} Мой Bean: общественный класс BulkUpdate {@NotEmpty общественности Список recordIds; Обновления общественности Список @NotEmpty @Valid; .... добытчики и сеттера ....} Вот моя проблема, когда я исполняю конечную точку это получить NullPointerException при попытке использовать autowired картографа. Выход из заявлений печати я опубликовал выше весьма красноречивый. В обоих конструктору и секциях @PostConstruct я получаю один и тот же идентификатор объекта для проверки правильности, и я также получить идентификатор для картографа. Однако, как только IsValid называется, она выводит другой идентификатор объекта. Я знаю, что весной удалось валидатор создается, но это не используется. Кроме того, I» пробовал удалить @ValidBulkUpdate аннотацию из конечной точки REST и поместить его внутри объекта оболочки, думая, что, может быть, @Valid необходимо было получить весной взять на себя, как показано ниже: общественный @ResponseBody RestResponse bulkUpdate (@Valid BulkupdateWrapper bulkUpdate) {. .. материал здесь ...} И обертка общественного класса BulkUpdateWrapper {@ValidBulkUpdate обновление частных BulkUpdate; .... геттер и сеттер ....} Это оставляет меня с совершенно новой ошибкой, которая даже страннее: «JSR-303 подтверждено свойство„update.org.hibernate.validator.internal.engine.ConstraintViolationImpl“вовсе не имеет соответствующая сбруя»Я не уверен, куда обратиться, надеюсь, кто-то есть идея. Или, как заставить его использовать Spring удался валидатор, или как удалить эту неопределенную ошибку, когда я использую объектную оболочку; Это хуже, это у меня есть MockMvc интеграции на основе тестов для этого, которые работают без сбоев, это происходит только тогда, когда я развернуть его. UPDATE Итак, я продолжал свою обертку и изменил @Valid к @Validated и теперь моя ошибка заключается в следующем: «NotReadablePropertyException: Bean свойство„update.field“не имеет соответствующего аксессор для данных Spring привязки» Fun факт, что нет никакой собственности называется «поле»
the_camino
1

голосов
1

ответ
56

Просмотры

Положитесь на абстракциях, а не на конкрементов

Например, я хочу, чтобы написать свой проект без каких-либо рамок, но с готовыми библиотеками, а не изобретать велосипед. Но, конечно, в эволюции проекта я буду писать свои собственные классы, которые могут быть перемещены из проекта, например, он будет \ Acme \ Framework пространства имен. И мои файлы проект с доменом слоем будет находиться под \ имен Acme \ Projectname. Таким образом, в точке я хочу использовать компонент HttpFoundation Symfony иметь дело с HTTP слоя. И мне нужно, чтобы ввести запрос класса в контроллеры. Но SOLID принципы говорят, что классы должны зависеть от абстракций вместо конкрементов. Означает ли это, мне нужно создать класс \ Acme \ Framework \ Request, который зависит от запроса Symfony и использовать его? Или я могу использовать запрос Symfony как есть. Что можно сказать о передовой практике в этом случае? Простите за мой английский, если это причиняет тебе боль
Mark Yeltsin
1

голосов
2

ответ
51

Просмотры

How to test function that creates and injects a dependency

Мой вопрос заключается в том, как вы решаете, куда вводить зависимость, и как проверить функцию, в которой зависимость первого впрыскивается в функцию? Например, я рефакторинг кода Go использовать зависимость инъекции с целью иметь код более проверяемый. Это то, что мой рефакторинга код выглядит следующим образом: интерфейс FooIface типа {FooFunc) (} типа Foo STRUCT {} FUNC (F * Foo) FooFunc) {// Некоторые функции я хотел бы окурок} (FUNC основной () {OuterFunction () } функ OuterFunction () {fooVar: = & Foo {} InnerFunction (fooVar) // Прочее} функ InnerFunction (е * FooIface) {f.FooFunc () // Прочее} Я могу легко проверить InnerFunction путем создания фиктивная структура, которая реализует FooIface с погасили FooFunc (), так что все хорошо здесь. Тем не мение, что, если я хотел проверить OuterFunction ()? Тогда как бы я окурок FooFunc () оттуда, так как вводится зависимость создается в OuterFunction ()? Должен ли я перенести создание и Foo {} STRUCT один уровень вверх из OuterFunction (), создав его в основной, а затем впрыскиванием в OuterFunction ()? Другими словами, как бы вы проверить функцию, которая создает и внедряет зависимость?
Andrew
1

голосов
1

ответ
38

Просмотры

IoC в домене Layer

В моем слое домена У меня есть контракт хеширование. Один из моих доменных служб зависят от этого договора. На данный момент я впрыскиваю его в методе __construct. В уровне инфраструктуры у меня есть выполнение этого контракта. Я написал то, что выглядит как IoC контейнер, который создает услуги с автоматической проводкой инъекционной. Это все работает. Но я знаю зависимость, что услуга будет расти. Я добавлю гораздо больше UseCases им. И есть еще одна проблема - контейнер впрыскивает все зависимости, но мы могли бы использовать только один USECASE, поэтому он будет делать лишнюю работу. Это нормально, если я буду вводить сам IoC контейнер вместо многих параметров, и использовать его в UseCases. IoC договор заключается также в доменных именах контрактов Layer
Mark Yeltsin
1

голосов
0

ответ
48

Просмотры

Есть простой способ использовать DI в Actor Service Fabric .Net?

Есть простой способ использовать DI в Actor Service Fabric .Net? Что-то вроде AddScoped (), которая доступна в Service Fabric Stateful услуг, что позволяет мне вводить. Мне нужен новый конструктор для моего актера и использование actorServiceFactory не будет делать, потому что я не могу создать объект Repo, мне нужно, чтобы быть введен.
M.F.
1

голосов
0

ответ
244

Просмотры

Не удается найти класс символов DaggerAppComponent при добавлении ContributesAndroidInjector

Я постоянно получаю ошибку DaggerAppComponent не удается найти класс символов, когда я построить приложение только после того, как я добавить @ContributesAndroidInjector аннотацию внутри ActivityBuilder. У меня есть доказательство концепции проекта, который имеет точно такую ​​же установку и строит / работает отлично. Действительно озадачены, почему он не будет сейчас строить. Вот что у меня есть: AppComponent: @Singleton @Component (модули = {AndroidInjectionModule.class, AppModule.class, ActivityBuilder.class}) общедоступный интерфейс AppComponent {аннулируются инъекционные (MyApplication приложение); @ Component.Builder Interface Builder {приложение @BindsInstance Builder (приложение Приложение); AppComponent сборки (); }} AppModule @Module класс AppModule общественного {@Provides @Singleton PrefsHelper providePrefsHelper (PrefsHelperImpl prefsHelper) {вернуться prefsHelper; } @Provides @Singleton DataManager provideDataManager (DataManagerImpl DataManager) {вернуть DataManager; } @Provides @Singleton контекст provideContext (приложение Приложение) {вернуть приложение; } @Provides SchedulerProvider provideSchedulerProvider () {возвращают новые SchedulerProviderImpl (); } @Provides @PrefsInfo Строка providePreferencesName () {вернуть C.PREFS_NAME; }} ActivityBuilder @Module общественного абстрактного класса ActivityBuilder {@ContributesAndroidInjector (модули = {MainActivityModule.class}) абстрактный MainActivity bindMainActivity (); } Класс Применение внутри OnCreate DaggerAppComponent.builder () .Application (это) .build () .inject (это); MainActivityModule пуст ради этого примера: @Module общественного класса MainActivityModule {} Я использую библиотеку поддержки версию 26.1.0 и кинжал 2.16 реализацию «com.google.dagger: Кинжал-андроид: $ rootProject.daggerVersion» реализацию «ком .google.dagger: кинжал-андроид-поддержка: $ rootProject.daggerVersion "annotationProcessor "com.google.dagger: кинжал-составитель: $ rootProject.daggerVersion" annotationProcessor" com.google.dagger: кинжал-андроид-процессор: $ rootProject. daggerVersion»Как только я удалить ContributesAndroidInjector линию проекта строит хорошо, иначе я получить не удается найти класс символов DaggerAppComponent. Каждый имеет какие-либо идеи, что может быть не так? 16 реализация "com.google.dagger: Кинжал-андроид: $ rootProject.daggerVersion" реализация "com.google.dagger: Кинжал-андроид-поддержка: $ rootProject.daggerVersion" annotationProcessor «com.google.dagger: Кинжал-составитель: $ rootProject.daggerVersion»annotationProcessor„com.google.dagger: кинжал-андроид-процессор: $ rootProject.daggerVersion“Как только я удалить ContributesAndroidInjector линию проекта строит хорошо, иначе я получить не удается найти класс символов DaggerAppComponent. Каждый имеет какие-либо идеи, что может быть не так? 16 реализация "com.google.dagger: Кинжал-андроид: $ rootProject.daggerVersion" реализация "com.google.dagger: Кинжал-андроид-поддержка: $ rootProject.daggerVersion" annotationProcessor «com.google.dagger: Кинжал-составитель: $ rootProject.daggerVersion»annotationProcessor„com.google.dagger: кинжал-андроид-процессор: $ rootProject.daggerVersion“Как только я удалить ContributesAndroidInjector линию проекта строит хорошо, иначе я получить не удается найти класс символов DaggerAppComponent. Каждый имеет какие-либо идеи, что может быть не так?
Filip Luchianenco
1

голосов
0

ответ
20

Просмотры

Вводить имя одного бина в конструктор другого боба

общественного class1 {@Bean (имя = "S1") публичное Class1 s1 {} @Bean (имя = "S2") публичный класс 2 s2 {} @Bean (имя = "s3") публичное Class3 s3 (@name ( "S1" ), @name ( "s2")) {} @Bean (имя = "s4") публичное Class4 s4 {возвратить новый SomeFunction (@name ( "s3"))}} Предположим, что мы имеем, как и выше н. Где четко Bean s3 зависит от s1 и s2. А теперь я хотел бы передать выход s3 в SomeFunction другого s4 Bean, что я должен делать? Кажется, @name ( «s3») здесь не работают, и, может быть, я должен использовать другие аннотации? Спасибо
LookIntoEast
1

голосов
1

ответ
49

Просмотры

Различные масштабы ДИ для контроллера и запросов в graphql-DotNet?

Я пытаюсь реализовать grahql-Dotnet API. Я бег в какое-то странное поведение, когда я пытаюсь передать контекстный объект в мой контроллер и тот же объект в некоторые из моих услуг, используемых запросы с помощью инъекции зависимостей ядра DotNet. Кажется, что есть другая сфера DI используется, когда DI инициализирует контроллер и когда он инстанцирование объектов, используемые запросы, так как два отдельных объектов, передаваемые в данном случае. Является ли это ожидаемое поведение или это что-то, что можно избежать? Я делаю все же основной проводки контроллера и запроса в качестве проекта звездных войн. заранее спасибо
Will P.
1

голосов
0

ответ
36

Просмотры

Retrieve current user in Symfony app while respecting LoD

У меня возникли некоторые проблемы с пониманием, как Закон Деметры следует применять в некоторых случаях с системой DI Symfony в. У меня есть завод, который требует доступ к текущим вошедшему пользователю в приложении. Для этого мне нужно требовать @ security.token_storage вводить его в качестве аргумента конструктора. Но в моей фабрике, чтобы получить доступ к пользователю, мне нужно будет сделать: $ tokenStorage-> getToken () -> GetUser (), и хуже, если я хочу, чтобы получить доступ к некоторому свойству моего пользователя, мне нужно будет погружаться на один уровень глубже , Как бы вы решить эту проблему в соответствии с законом Деметры? Вот пример моего кода: класс SomeFactory {/ ** * @var Пользователь * / частные $ CurrentUser; / ** * @param TokenStorageInterface $ tokenStorage * / общественная функция __construct (TokenStorageInterface $ tokenStorage) {$ this-> CurrentUser = $ this-> setCurrentUser ($ tokenStorage); } / ** * @param TokenStorageInterface $ tokenStorage * / защищенную функцию setCurrentUser (TokenStorageInterface $ tokenStorage) {если ($ tokenStorage-> getToken () && $ tokenStorage-> getToken () -> GetUser () && in_array ( 'ADMIN_ROLE', $ tokenStorage-> getToken () -> GetUser () -> getRoles ())) {$ этом-> CurrentUser = $ tokenStorage-> getToken () -> GetUser (); }}} Я надеюсь, что я являюсь ясно. Большое спасибо :) getToken () -> GetUser () && in_array ( 'ADMIN_ROLE', $ tokenStorage-> getToken () -> GetUser () -> getRoles ())) {$ this-> CurrentUser = $ tokenStorage-> getToken () -> GetUser (); }}} Я надеюсь, что я являюсь ясно. Большое спасибо :) getToken () -> GetUser () && in_array ( 'ADMIN_ROLE', $ tokenStorage-> getToken () -> GetUser () -> getRoles ())) {$ this-> CurrentUser = $ tokenStorage-> getToken () -> GetUser (); }}} Я надеюсь, что я являюсь ясно. Большое спасибо :)
simsComputing
1

голосов
2

ответ
869

Просмотры

Spring boot test with multiple configuration

In my Spring boot 2.1 project I have different @Configurations for different test (ConfigurationA and ConfigurationB), that reside in different packages. Both configurations define the same set of beans but in a different manner (mocked vs. the real thing) As I am aware of the Bean overriding mechanism introduced in Spring Boot 2.1, I have set the property: spring.main.allow-bean-definition-overriding=true. However I do have a test with the following the setup of the following configuration and test class. First there is a @Configuration in the productive part (I'm using Maven): package com.stackoverflow; @Configuration public class ProdConfiguration{ ... } Then in the test branch there is a general Test @Configuration on the same package level: package com.stackoverflow @Configuration public class TestConfiguration { @Bean public GameMap gameMap() { return Mockito.mock(GameMap.class); } } And in a subpackage I have another @Configuration: package com.stackoverflow.impl; @Configuration public class RealMapTestConfiguration { @Bean public GameMap gameMap() { return new GameMap("testMap.json"); } } And then of course there is the test that is troubling me: package com.stackoverflow.impl; @ExtendWith(SpringExtension.class) @SpringBootTest @ContextConfiguration(classes={RealMapTestConfiguration.class, ProdConfiguration.class}) @ActiveProfiles("bug") // spring.main.allow-bean-definition-overriding=true public class MapImageServiceIT { @Autowired private GameMap map; } It turns out that the injected GameMap into my test is a mock instance from TestConfiguration instead of the real thing from RealMapTestConfiguration. Aparrently in my test I have the configuration from ProdConfiguration and TestConfiguration, when I wanted ProdConfiguration and RealMapTestConfiguration. As the beans defined in the ProdConfiguration and *TestConfiguration are different the combination works, but TestConfiguration and RealMapTestConfiguration define the same been. It seems like the TestConfiguration is picked up by component scanning as it is in the same package as ProdConfiguration. I was under the impression that when overriding beans the bean definition that is closer to the test class would be preferred. However this seems not to be the case. So here are my questions: When overriding beans, what is the order? Which bean overrides which one? How to go about to get the correct instance in my test (using a different bean name is not an option, as in reality the injected bean is not directly used in the test but in a service the test uses and there is no qualifier on it.)
hotzst
1

голосов
1

ответ
55

Просмотры

Python круговой импорт в атрибутах класса

У меня есть следующие файлы: user.py ... от models.company импорта класса компании пользователя (BaseModel): компания = ForeignKeyField (компания ...) ... company.py ... от models.user класса импорта пользователя Компания (BaseModel): пользователь = ForeignKeyField (пользователь, ...) ... Это нормальная циклическая ошибка импорта, насколько питон обеспокоен. Проблема заключается в том, что обычные методы обхода (размещая оператор импорта в конце файла, импортирующие по-разному, и т.д ...) не работают в этом контексте, потому что я использую один класс в определении атрибута класса другой класс. Что такое правильный способ решить ошибку циклического импорта в этом контексте?
Nicolas Caous
1

голосов
0

ответ
128

Просмотры

Как справиться с NestJS Dependency Injection при расширении класса для службы?

Я пытаюсь обеспечить различные услуги на основе значения из моего ConfigService. Проблема я бегу в том, что модель мангуст, которая получает инъекции не возвращает никаких значений при выполнении запроса методов, таких как findOne () (результат нулевой) или countDocuments () (результат 0). Мои классы обслуживания определяются следующим образом: экспорт класса BaseService {конструктор (@InjectModel ( 'Cat') публичное catModel только для чтения: Model) {} CreateService (опция: строка) {если (опция === 'OTHER') {возвращение нового OtherService (this.catModel); } Еще если (опция === 'ДРУГОЙ') {возвращают новый AnotherService (this.catModel); } Еще {возвратить новый BaseService (this.catModel); }} Асинхронной findOne (ID: строка): Promise {возвращение ждут this.catModel.findOne ({_ ID: идентификатор}); } Асинхронной рассчитывать (): Promise {возвращение ждут this.catModel.countDocuments (); } TestClass () {console.log ( 'барщина класс, используемый'); }} @Injectable () экспорт класс OtherService расширяет BaseService {конструктор (@InjectModel ( 'Cat') публичное catModel только для чтения: модели) {супер (catModel); } TestClass () {console.log ( 'ДРУГИЕ УСЛУГИ КЛАСС ИСПОЛЬЗУЕМЫЕ'); }} @Injectable () экспорт класс AnotherService расширяет BaseService {конструктор (@InjectModel ( 'Cat') публичное catModel только для чтения: модели) {супер (catModel); } TestClass () {console.log ( 'Еще одна услуга, класс, используемый'); }} Это позволяет мне получить правильную услугу у провайдера (TestClass () печатает ожидаемую строку). Мой провайдер выглядит следующим образом: экспорт константного catProviders = [{обеспечить: 'CatModelToken', useFactory: (подключение: Соединение) => connection.model ( 'CAT', CatSchema), вводят: [ 'DbConnectionToken']}, {обеспечивают: 'BaseService', useFactory: (ConfigService: ConfigService, подключение: подключение) => {сопз варианты = ConfigService .get ( 'service_type'); пусть модель = connection.model ( 'CAT', CatSchema); вернуть новый BaseService (модель) .createService (варианты); }, Впрыснуть: [ConfigService, 'CatModelToken', 'DbConnectionToken'],}]; Поэтому мой вопрос состоит из двух частей: Есть ли лучший способ справиться с созданием соответствующего класса и, чтобы избежать необходимости создания экземпляра BaseService с единственной целью вызова CreateService ()? Что такое правильный способ, чтобы придать модели мангуста во вновь созданной службе? Я также не могу использовать пример useClass из документации,
cameronliam
1

голосов
2

ответ
64

Просмотры

Как использовать инъекции зависимостей в метод или свойство?

Обычно я использую Dependency инъекции в конструкторе класса. Зависимости регистрируются в контейнере единства, ф: container.RegisterType (); Но в одном классе не представляется возможным вводить с помощью конструктора (это класс третьей стороны, которую я наследовать от и конструктора по умолчанию (без инъекций) должно быть использовано. Как я могу использовать мой MyClass в этом классе тоже? Спасибо!
babbelut
1

голосов
0

ответ
20

Просмотры

Android: Обновление Constructor Значение и Provider Dagger2 в режиме исполнения

Я использую библиотеку dagger2 для моего приложения. то я использую андроид SQLite для хранения своих данных. проблема моя версия базы данных может быть обновление с WebService / API, когда мое приложение в режиме исполнения. Как я знаю, что версия базы данных можно обновить, когда я звоню DatabaseSqlite дб = новый DatabaseSqlite (контекст, версии, name_of_database). Но как я могу обновить свою версию базы данных, когда моя версия базы данных обеспечивает классом AppModule в? Могу ли я обновить поставщик в Dagger в исполняющем? это мой класс AppModule: общественный класс AppModule {@Provides @Singleton Контекст provideContext (приложение Application) {вернуть приложение; } @Provides @Singleton ApiHelper provideApiHelper (AppApiHelper appApiHelper) {вернуть appApiHelper; } @Provides @Singleton DataManager provideDataManager (AppDataManager appDataManager) {вернуть appDataManager; } @Provides @DatabaseInfo Строка provideDatabaseName () {вернуть AppConstants.DB_NAME; } @Provides @DatabaseInfo Целое provideDatabaseVersion (PreferencesHelper preferencesHelper) {вернуть preferencesHelper.getVersion (); } // это как я обновить базы данных версии @Provides @Singleton Gson provideGson () {вернуть новый GsonBuilder () excludeFieldsWithoutExposeAnnotation () создать ()..; } @Provides @PreferenceInfo Строка providePreferenceName () {вернуть AppConstants.PREF_NAME; } @Provides @Singleton PreferencesHelper providePreferencesHelper (AppPreferencesHelper appPreferencesHelper) {вернуть appPreferencesHelper; } @Provides SchedulerProvider provideSchedulerProvider () {вернуть новый AppSchedulerProvider (); }}, И это мой DatabaseSqlite класс: открытый класс DatabaseSqlite расширяет SQLiteOpenHelper {частный статический финал Строка TAG = «DatabaseSqlite»; контекст частного контекста; частный ArrayList mlogVersion = NULL; @Inject (контекст Контекст, @DatabaseInfo Строка DbName, @DatabaseInfo Integer версия) публичный DatabaseSqlite {супер (контекст, DbName, нулевой вариант); } Общественного DatabaseSqlite (контекст Context, внутр версия, ArrayList version_log) {супер (контекст, DB_NAME, нулевой вариант); этот. mlog_version = version_log; this.context = контекст; } @Override общественный недействительный OnCreate (SQLiteDatabase дБ) {если (app_version_log! = NULL) {для (Log_version dataUpdateModel: Log_version) {Log.e (TAG, "OnCreate:" + dataUpdateModel.getId ()); db.execSQL (dataUpdateModel.getQuer ()); } Log.e (TAG, "OnCreate: Готово"); }} @Override общественного недействительными onUpgrade (SQLiteDatabase дБ, Int oldVersion, Int newVersion) {если (oldVersion <newVersion) {OnCreate (дБ); }} Это мой DataManager класс, который обрабатывать depedencies для моего класса DatabaseSqlite: общественный класс AppDataManager реализует DataManager {личное окончательное ApiHelper mApiHelper; частный окончательный контекст mContext; частный окончательный Gson mGson; частный окончательный PreferencesHelper mPreferencesHelper; частный DatabaseSqlite mDatabaseSqlite; частная Вставка mInsert; частный Выберите mВЫБОР,; @Inject общественного AppDataManager (контекст Context, PreferencesHelper preferencesHelper, ApiHelper apiHelper, Gson gson, DatabaseSqlite databaseSqlite, вставить вставку, выберите Select) {mContext = контекст; mPreferencesHelper = preferencesHelper; mGson = gson; mApiHelper = apiHelper; mDatabaseSqlite = databaseSqlite; mInsert = вставка; = mВЫБОР, выберите; } @Override общественного DatabaseSqlite setDatabaseSqlite (контекст Context, внутр версии, ArrayList app_version_log) {mDatabaseSqlite = новый DatabaseSqlite (контекст, версия, app_version_log); вернуться mDatabaseSqlite; } // Я пытаюсь передать данные в costructor мой базы данных SQLite} и это, как способ, которым я пытаюсь обновить свою версию базы данных в моей деятельности: . GetDataManager () SetVersion (itemVersionResponse.getVersion ()); getDataManager () setDatabaseSqlite (контекст, itemVersionResponse.getVersion (), dataUpdateModels). Есть ли что-то неправильно, что делает мою версию базы данных не обновить? пожалуйста, я надеюсь, что кто-то может сказать мне, где моя ложь. большое спасибо вам
Menma
1

голосов
2

ответ
109

Просмотры

Передавать данные конфигурации в зависимости от углового в библиотеке с помощью «forRoot»

Я создал две угловые библиотеки, одна имеет другой, как зависимость. зависимость должна быть настроена с использованием метода forRoot. Как я могу передать данные конфигурации из родительской библиотеки это зависимость? Например, предположим, что мы имеем TopLevelLib, который имеет OtherLib как зависимость. OtherLib необходимо передать объект конфигурации, используя forRoot. Конечный пользователь AppModule, импорт в @NgModule ({импорт: [TopLevelLib.forRoot (someConfigData)], декларации: [...], экспорт: [...]}) экспорт класс AppModule {} TopLevelLib - импортировано в AppModule самыми конечный пользователь @NgModule ({импорт: [... OtherLib.forRoot (*****, что происходит здесь *****)?], декларации: [...], экспорт: [...]} ) экспорт класс TopLevelLib {статический forRoot (конфиг: ConfigObj): ModuleWithProviders {возвращение {ngModule: SampleModule, провайдеры: [{обеспечивают: SomeInjectionToken, useValue: конфигурации}]}; }} OtherLib - ввозимые TopLevelLib @NgModule ({импорт: [...], декларации: [...], экспорт: [...]}) экспорт класс OtherLib {статический forRoot (конфиг: ConfigObj): ModuleWithProviders { Обратный {ngModule: SampleModule, провайдеры: [{обеспечивает: SomeInjectionToken, useValue: конфигурации}]}; }} Что мне нужно, чтобы передать экземпляр объекта конфигурации из TopLevelLib в OtherLib. Так что, когда конечный пользователь настраивает TopLevelLib с помощью forRoot, OtherLib будет настроен с теми же данными. Любые идеи о том, как осуществить это? ]}) Экспорт класс OtherLib {статический forRoot (конфиг: ConfigObj): ModuleWithProviders {возвращение {ngModule: SampleModule, провайдеры: [{обеспечивают: SomeInjectionToken, useValue: конфиг}]}; }} Что мне нужно, чтобы передать экземпляр объекта конфигурации из TopLevelLib в OtherLib. Так что, когда конечный пользователь настраивает TopLevelLib с помощью forRoot, OtherLib будет настроен с теми же данными. Любые идеи о том, как осуществить это? ]}) Экспорт класс OtherLib {статический forRoot (конфиг: ConfigObj): ModuleWithProviders {возвращение {ngModule: SampleModule, провайдеры: [{обеспечивают: SomeInjectionToken, useValue: конфиг}]}; }} Что мне нужно, чтобы передать экземпляр объекта конфигурации из TopLevelLib в OtherLib. Так что, когда конечный пользователь настраивает TopLevelLib с помощью forRoot, OtherLib будет настроен с теми же данными. Любые идеи о том, как осуществить это?
Roip
1

голосов
1

ответ
34

Просмотры

Autofac - Украсьте все компоненты от конкретного узла

Так что я хочу сделать некоторые профилирования на куче контроллеров, которые наследуют от System.Web.Http.ApiController. В проекте, который делает профилирование, мы их регистрации builder.RegisterApiControllers (TypeOf (Web.Modules.AutofacModule) .assembly) .Как (тип => новый Autofac.Core.KeyedService ( "API", типа)); Позже я пытаюсь зарегистрировать декоратор для каждого с builder.RegisterDecorator (оригинал => Украсить (оригинал, профайлер), fromKey: «апите»); где Украсьте впрыскивают некоторое профилирование кода через DelegatingHandler и возвращает оригинал. Я могу решить контроллеры просто отлично: scope.ResolveKeyed ( «API»); но профилирование кода никогда не вызывается, ни Украсьте. Моя первая мысль была, что, может быть, мне нужно, чтобы зарегистрировать компоненты контроллера как ApiController, но сбрасывание. Как () чуть ниже первый фрагмент не был успешным. Любая помощь будет супер. Это, вероятно, просто сводится к тому, моему отсутствию Autofac-фу.
Jared MacFarlane
1

голосов
1

ответ
86

Просмотры

Как интегрировать инъекции зависимостей с пользовательскими декораторами

Я пытаюсь создать декоратор, который требует инъекций зависимостей. Например: @Injectable () класса UserService {@TimeoutAndCache (1000) асинхронной GetUser (ID: строка): Promise {// Выполнение вызова к БД, чтобы получить все пользователи}} На @TimeoutAndCache возвращает новое обещание, которое выполняет следующее: если вызов занимает больше времени, чем 1000 мс, возвращает отказ и при завершении вызова, он сохраняет в Redis (так что это может быть извлечен в следующий раз). Если вызов занимает менее 1000 мс, просто возвращает результат экспорта Const TimeoutAndCache = функция timeoutCache (TS: число, пространства имен) {журнал функцию возврата (цель: объект, propertyKey: струнные, дескриптор: TypedPropertyDescriptor,) {сопз originalMethod = descriptor.value; // сохранить ссылку на оригинальный метод descriptor.value = функция (... арг: любое []) {// предварительно пусть timedOut = ложь; // запускать и хранить результат константный результат: Promise = originalMethod.apply (это, арг); Const задача = новый Promise ((решительность, отклонять) => {сопз таймер = SetTimeout (() => {если (timedOut) {timedOut = истина;! console.log ( 'тайм-аут до окончания'); отклонять ( 'timedout ');}}, ц); result.then (Рез => {если (timedOut) {// хранить в кэш console.log (' магазин в кэше ');} еще {clearTimeout (таймер); // возвращает результат решимость (RES);}});}); вернуть задачу; }; вернуть дескриптор; }; }; Мне нужно, чтобы ввести RedisService, чтобы сохранить оценочный результат.
Kartik Andalam

Просмотр дополнительных вопросов