Циркулярная ссылка с моим загрузчиком / Unity - PullRequest
1 голос
/ 27 июля 2011

У меня серьезная проблема с моим Unity и загрузчиком. Это круговая ссылка.

Позвольте мне объяснить, что у меня есть:

MainApp (winforms)

ServiceLayer - C # проект

DependencyInjection - C # проект для контейнера

Bootloader - проект C # для загрузчика, который выполняет сопоставления для autopper и Unity.

Теперь у загрузчика есть ссылки на все, т.е. на службу, контейнер и т.д. на mainApp (winforms), и он отлично справляется со своей работой.

Проблема в том, что я запускаю загрузчик из моего MainApp (winforms), вот так

 DI.Container.RegisterType<IBootstrapper, Bootstrapper>(
    new InjectionConstructor(DI.Container));

            var bootstrapper = DI.Container.Resolve<IBootstrapper>();

            bootstrapper.StartUp();

Теперь проблема в следующем: MainApp нужна ссылка на Bootloader, потому что там находится класс и интерфейс - но я не могу, потому что Bootloader имеет ссылку на MainApp, так как загрузчик регистрирует некоторые вещи, которые находятся в mainapp .

Я думаю, что где-то запутался, основная идея состояла в том, чтобы переместить загрузчик из mainapp в его собственную сборку, и у Контейнера тоже есть своя сборка; загрузчик нуждается во всех своих ссылках, включая MainApp, но, конечно, Mainapp требуется ссылка на загрузчик для его создания и запуска.

Редактировать

Конечно, я мог бы регистрировать типы из mainapp, напрямую обращаясь к контейнеру, но разве это не побеждало объект наличия моего загрузчика, который обо всем позаботился?

Ответы [ 3 ]

1 голос
/ 28 июля 2011

Почему бы не установить проект DependencyInjection в качестве запускаемого проекта, написать в нем метод Main, а затем вызвать ваш загрузчик оттуда?Единственное существенное изменение заключается в том, что вам нужно сделать проект DI EXE-файлом, а не DLL-библиотекой, и наоборот для проекта UI.

1 голос
/ 28 июля 2011

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

Если вы хотите увидеть все, что я написал, включая некоторые диаграммы, вы можете найти их здесь: Используя StructureMap, одна из этих проектных организаций лучше другой?

Если есть лучший ответ, надеюсь, кто-то укажет на него, и я тоже буду учиться на этом.

В принципе, я думаю, у вас есть пара вариантов.

Вы можете объединить ваш загрузчик и MainApp в одном проекте. (как вы сказали, это кажется "неправильным")

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

Вы можете удалить свою ссылку из MainApp в BootLoader, а затем использовать посмотреть, есть ли другие способы автоматического получения ссылки на BootLoader во время выполнения с использованием Unity. Я использую StructureMap, в котором есть функция, позволяющая сканировать некоторые сборки (при запуске приложения), а затем вы можете сказать ему, чтобы он применял «соглашения по умолчанию», что означает, что существует интерфейс с именем IWhothing и класс Независимо от того, что: IWh независимо, тогда это автоматически настроит это так, прося экземпляр IW, который даст вам конкретный пример Whither.

Таким образом, вы можете иметь ссылку на BootLoader MainApp во время компиляции, но при этом иметь код в MainApp, который может обращаться к материалам в BootLoader во время выполнения (с помощью IOC и через интерфейс).

Надеюсь, это поможет.

0 голосов
/ 28 июля 2011

Это может быть проблема дизайна. Как насчет другого слоя косвенности? :)

А если серьезно: что ваш загрузчик использует в основном приложении? Возможно ли переместить это в свою сборку?

Еще одна странная вещь - это отношения между основным приложением и загрузчиком. Они кажутся довольно тесно связанными, так для чего служит загрузчик? Разве нельзя просто поместить класс загрузчика в основное приложение?

Просто нужно больше информации о вашей настройке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...