1

Я большой поклонник использования приложений Unity для .NET, чтобы модули кода и зависимостей «управлялись» в больших кодовых базах. Я использовал его в течение многих лет с помощью .NET, выгружая сборки в каталог программы основной программы и переконфигурируя конфигурационный файл IoC (обычно файл .exe.config), вводя новое поведение в программу без необходимости повторной компиляции основная программа.Универсальные приложения с IoC: Управление зависимостями/изоляция

Однако я начал свой набег на создание универсальных приложений для Windows Store и, что более важно, Windows IoT - однако, поскольку эти приложения «упакованы» во время компиляции, мне трудно понять, как лучше продолжать работу это.

Один из возможных вариантов заключается в компиляции «модулей» (библиотек классов PCL/Universal) и их включении (и их зависимостях) в качестве файлов «Содержимое» в универсальном приложении, а затем использовать отражение для загрузки типов из этих сборок во время запуск программы посредством отражения.

Другим вариантом будет включение всех модулей и их зависимостей в ссылки на проекты основной программы перед компиляцией, но с использованием «инъекции зависимостей бедных людей для жесткого кодирования регистраций и разрешений», но для меня это действительно неправильно. в идеале хотел бы сохранить разделение зависимостей, если это вообще возможно?

Любые идеи ...?

PS. Я никак не привязан к Unity, если есть еще одна библиотека IoC, которая делает это лучше на этой платформе, тогда прекрасно, но Unity - это то, что я уже знаю и люблю!

ответ

1

Я делаю это, используя замок Виндзор. Вы, вероятно, можно использовать тот же подход, с Unity:

  • Предельные ссылки только до момента, когда сборка нуждается в тип, определенный в другой узел
  • Определение класса (или классов в зависимости от того, как вы хотите организовать) для IoC конфигурации в каждой сборке путем внедрения IWindsorInstaller и настройки DI с использованием свободного API в реализованном методе Install.
  • Определить экземпляр контейнера внутри приложения корня
  • При запуске приложения, использовать отражение, чтобы найти все типы, реализующие IWindsorInstaller в папку бен и запустить свой метод Install, передавая экземпляр контейнера

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

+0

Итак, как вы собираетесь распространять эти сборки в универсальном приложении, сохраняя изоляцию? – tommed

+0

@tommed Определите как ваш интерфейс, так и реализацию вместе в указанной сборке и подключите ее к конфигурации, определенной в этой сборке, и только ссылку на интерфейс из основного приложения. Я бы поставил под вопрос необходимость разделить интерфейс и реализацию, но если вы это сделаете, вам нужно будет определить интерфейс в промежуточной сборке. – moarboilerplate

+0

@tommed Изоляция возникает из-за возможности реализовать базовую реализацию, пока интерфейс остается прежним. – moarboilerplate