Я пытаюсь понять, как использовать простой инжектор в следующей ситуации.
У меня есть решение с 4 проектами
Business, Repo и Api имеют прямую ссылку на Контракт.
Контракт имеет интерфейс для бизнеса и репо
Бизнес реализует проект IB Business from Contract и
Репо реализует IRepo из контрактного проекта
Я не хочу, чтобы в API была ссылка на проект Business или Repo. Эти две скомпилированные сборки будут помещены в общее место (например, в папку bin на api).
Вот фото или то, что я хочу.
Когда я смотрю документацию на 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.
Пожалуйста, не стесняйтесь помочь.
Api - это точка входа
Я отредактировал вопрос, чтобы сузить круг вопросов для лучшего понимания моих проблем. Взгляни, пожалуйста.
@steven Пожалуйста, взгляните на вопрос еще раз.
Вы можете позже привязать тип, указав его имя в файле конфигурации и загрузить тип с помощью Type.GetType(typeName), как вы можете видеть в листинг 1.2 в свободно доступной первой главе эта книга. \
Даже после вашего обновления вся необходимая информация по-прежнему указана в дубликат сообщения, а именно: 1). Ни Business, ни Repo не должны связывать свои собственные зависимости, это должен делать только Composition Root. 2). Умышленно, что Composition Root ссылается на все, и не должен вызывать беспокойства, кроме случаев, когда вам нужно иметь возможность заменить Business или Repo без перекомпиляции вашего проекта API, что кажется маловероятным.
3). Если вы хотите, чтобы сборка, содержащая ваши контроллеры API, была отделена от сборок Business и Repo, переместите этот код из запускаемого проекта в проект «Уровень представления». Опять же, это вся информация, которую можно найти в здесь, здесь и, более подробно, в здесь.
Функция Simple Injector, похожая на модули Ninject, - это пакеты. Вы можете узнать больше об этом здесь. Но, как указано в документации, вам нужны пакеты только тогда, когда вам нужна поздняя привязка, с чем я согласен, что вы этого не делаете (или, по крайней мере, ничто в вашем сообщении не сигнализирует о том, что вам требуется поздняя привязка)
Стивен. Как мой корень композиции в API будет находить конкретный объект без необходимости ссылаться на проекты (чего я хочу избежать)? У меня есть книга, и я читаю ее уже некоторое время. У меня тоже первая версия. Раньше мне удавалось создавать полностью разделенные слои. Все проекты ссылались только на Контракт. В проекте Business и Repo был NinjectModule, который выполнял сопоставление. Я все еще мог правильно поменять местами реальный проект и тестовые проекты. Я пытался добиться того же с помощью SimpleInjector, и у меня возникли проблемы с ним (ссылка: изображение в основном посте добавлено)
Пожалуйста, простите мое незнание о SimpleInjector, я просто пытаюсь лучше понять инструмент, и мне кажется, что у меня есть молоток, и все выглядит как гвоздь. Итак, я пытаюсь понять, какую «БАЗОВУЮ» часть мне не хватает.
Мой ответ остается прежним. По определению, Composition Root жестко зависит от каждой зависимости в системе. Это не то, что вам следует предотвращать. Вы должны предотвратить зависимость любого другого уровня от контейнера DI. Оба пункта описаны в книге. Simple Injector никоим образом не ограничивает вас. Вы можете использовать его так же, как и с Ninject. Однако мой аргумент: вы не должны делать то же самое. Вместо этого следуйте методам, описанным в обоих изданиях, поскольку они дадут наилучший результат.
@Steven, я думаю, это отвечает, если корню композиции (в данном случае API) нужна ссылка на все конкретные классы. Я предпочитаю, чтобы API ссылался только на Контракт, а не на какие-либо жесткие ссылки на Бизнес или Репо. Сохранение гибкости API. Так что в будущем, если я решу создать еще один проект API, я могу ссылаться только на Контракт. Business and Repo знает, какой конкретный класс предоставить по мере поступления запроса. Я ценю вашу помощь в этом вопросе, я многому научился. Надеюсь, я не задавал слишком много глупых вопросов.





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