SimpleInjector с API, как выполнить позднее связывание с SimpleInjector?

Я пытаюсь понять, как использовать простой инжектор в следующей ситуации.

У меня есть решение с 4 проектами

  1. Бизнес (конкретные бизнес-классы)
  2. Репо (конкретные классы репо)
  3. Контракт (только интерфейсы)
  4. API (корень композиции)

Business, Repo и Api имеют прямую ссылку на Контракт.

Контракт имеет интерфейс для бизнеса и репо

Бизнес реализует проект IB Business from Contract и

Репо реализует IRepo из контрактного проекта

Я не хочу, чтобы в API была ссылка на проект Business или Repo. Эти две скомпилированные сборки будут помещены в общее место (например, в папку bin на api). Вот фото или то, что я хочу. SimpleInjector с API, как выполнить позднее связывание с SimpleInjector? Когда я смотрю документацию на simpleinjector, меня просят сделать что-то вроде следующего

container.Register<IRepo, Repo>();

Это предполагает, что проект API знает проект Repo. Это не так. API Project знает только о Контракте, который имеет интерфейсы IRepo и IBusiness. Таким образом, мой проект API никогда не будет компилироваться, поскольку в корне Composition, пока я регистрирую IRepo в Repo, проект APi ничего не знает о проекте Repo. API ссылается только на контрактный проект, который имеет только интерфейсы (IBusiness и IRepo). Проекты Business и Repo отделены от проекта Contract и ссылаются на интерфейсы IBusiness и IRepo для создания конкретных классов Business и Repo.

ВОПРОС: как выполнить позднее связывание с SimpleInjector?

Раньше я использовал ninject, а с помощью ninjectModule я мог сообщить проекту Business или Repo, если запрос от Contract приходит для IBusiness или IRepo, он должен сопоставить его с Business или Repo. Мне не нужна была ссылка на мой конкретный класс Api to Business или конкретный класс Repo.

Можно ли сделать то же самое с простым инжектором? Я не хочу помещать ссылку на проект для Business или Repo в проект API.

Я не уверен, что ищу подходящий элемент для достижения этой цели. Моя проблема заключается в понимании этого для SimpleInjector.

Пожалуйста, не стесняйтесь помочь.

Итак, какой проект предполагается использовать в качестве корня композиции?

Nkosi 07.01.2019 23:35

Api - это точка входа

Mhoque 07.01.2019 23:36

Я отредактировал вопрос, чтобы сузить круг вопросов для лучшего понимания моих проблем. Взгляни, пожалуйста.

Mhoque 09.01.2019 23:09

@steven Пожалуйста, взгляните на вопрос еще раз.

Mhoque 10.01.2019 18:29

Вы можете позже привязать тип, указав его имя в файле конфигурации и загрузить тип с помощью Type.GetType(typeName), как вы можете видеть в листинг 1.2 в свободно доступной первой главе эта книга. \

Steven 10.01.2019 21:10

Даже после вашего обновления вся необходимая информация по-прежнему указана в дубликат сообщения, а именно: 1). Ни Business, ни Repo не должны связывать свои собственные зависимости, это должен делать только Composition Root. 2). Умышленно, что Composition Root ссылается на все, и не должен вызывать беспокойства, кроме случаев, когда вам нужно иметь возможность заменить Business или Repo без перекомпиляции вашего проекта API, что кажется маловероятным.

Steven 10.01.2019 22:14

3). Если вы хотите, чтобы сборка, содержащая ваши контроллеры API, была отделена от сборок Business и Repo, переместите этот код из запускаемого проекта в проект «Уровень представления». Опять же, это вся информация, которую можно найти в здесь, здесь и, более подробно, в здесь.

Steven 10.01.2019 22:15

Функция Simple Injector, похожая на модули Ninject, - это пакеты. Вы можете узнать больше об этом здесь. Но, как указано в документации, вам нужны пакеты только тогда, когда вам нужна поздняя привязка, с чем я согласен, что вы этого не делаете (или, по крайней мере, ничто в вашем сообщении не сигнализирует о том, что вам требуется поздняя привязка)

Steven 10.01.2019 22:18

Стивен. Как мой корень композиции в API будет находить конкретный объект без необходимости ссылаться на проекты (чего я хочу избежать)? У меня есть книга, и я читаю ее уже некоторое время. У меня тоже первая версия. Раньше мне удавалось создавать полностью разделенные слои. Все проекты ссылались только на Контракт. В проекте Business и Repo был NinjectModule, который выполнял сопоставление. Я все еще мог правильно поменять местами реальный проект и тестовые проекты. Я пытался добиться того же с помощью SimpleInjector, и у меня возникли проблемы с ним (ссылка: изображение в основном посте добавлено)

Mhoque 10.01.2019 22:48

Пожалуйста, простите мое незнание о SimpleInjector, я просто пытаюсь лучше понять инструмент, и мне кажется, что у меня есть молоток, и все выглядит как гвоздь. Итак, я пытаюсь понять, какую «БАЗОВУЮ» часть мне не хватает.

Mhoque 10.01.2019 22:48
stackoverflow.com/questions/25856073/… Это аналогичная проблема, как у меня.
Mhoque 10.01.2019 22:50

Мой ответ остается прежним. По определению, Composition Root жестко зависит от каждой зависимости в системе. Это не то, что вам следует предотвращать. Вы должны предотвратить зависимость любого другого уровня от контейнера DI. Оба пункта описаны в книге. Simple Injector никоим образом не ограничивает вас. Вы можете использовать его так же, как и с Ninject. Однако мой аргумент: вы не должны делать то же самое. Вместо этого следуйте методам, описанным в обоих изданиях, поскольку они дадут наилучший результат.

Steven 10.01.2019 23:51

@Steven, я думаю, это отвечает, если корню композиции (в данном случае API) нужна ссылка на все конкретные классы. Я предпочитаю, чтобы API ссылался только на Контракт, а не на какие-либо жесткие ссылки на Бизнес или Репо. Сохранение гибкости API. Так что в будущем, если я решу создать еще один проект API, я могу ссылаться только на Контракт. Business and Repo знает, какой конкретный класс предоставить по мере поступления запроса. Я ценю вашу помощь в этом вопросе, я многому научился. Надеюсь, я не задавал слишком много глупых вопросов.

Mhoque 11.01.2019 22:52
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание API-ресурса Laravel может быть непростой задачей. Она требует глубокого понимания возможностей Laravel и лучших практик, чтобы обеспечить...
Как создать простое погодное приложение на Python с API OpenWeatherMap
Как создать простое погодное приложение на Python с API OpenWeatherMap
Этот учебник проведет вас через процесс создания простого погодного приложения с помощью Python и OpenWeatherMap API.
Пакеты Java
Пакеты Java
Пакет java - это группа классов, интерфейсов и подпакетов схожего типа. Думайте об этом как о папке в каталоге файлов. Мы используем пакеты, чтобы...
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
В этом руководстве вы узнаете, как использовать API парсинга квитанций за 5 минут с помощью JavaScript. Eden AI предоставляет простой и удобный для...
0
13
36
0

Другие вопросы по теме