Я видел, как люди жалуются на некоторые довольно грубые ошибки в Prism
Рассмотрение ваших проблем:
Проблема 1 : я не знаком с Prism, но с объектно-ориентированной точки зрения ваш класс Module Manager должен отслеживать, был ли загружен модуль, и если он еще не загружен, позволяет рекурсивно загружать другие Модули, использующие функцию карты в List<Module>
или любом другом типе, который Prism использует для абстрактного представления сборок. Короче говоря, пусть ваш Module Module реализует скрытое состояние, которое представляет список загруженных модулей. Ваша функция Map должна затем взять этот список модулей, уже загруженных, в качестве начального значения и вернуть список модулей, которые не были загружены. Затем вы можете либо усвоить логику для общедоступного метода LoadAllModules, либо разрешить кому-либо перебирать общедоступный List<UnloadedModule> where UnloadedModule : Module
и позволить им выбирать, что загружать. Я не рекомендовал бы выставлять оба метода одновременно из-за проблем параллелизма, когда к диспетчеру модулей обращаются через несколько потоков.
Проблема 2 : Требуется начальный вызов GetStream, поскольку ResourceManager лениво оценивает ресурсы. Интуитивно понятно, что причина этого в том, что спутниковые сборки могут содержать несколько специфичных для локали модулей, и если все эти модули были загружены в память одновременно, это может исчерпать кучу, и тот факт, что это неуправляемые ресурсы. Вы можете посмотреть код, используя RedGate .NET Reflector, чтобы определить детали. Вы можете вызвать более дешевый метод, чем GetStream. Вы также можете запустить его для загрузки сборки, обманув его, загрузив ресурс, который есть в каждой сборке Silverlight. Попробуйте ResourceManager.GetObject ("TOOLBAR_ICON") или, возможно, ResourceManager.GetStream ("TOOLBAR_ICON") - обратите внимание, что я не пробовал это, и набираю это предложение, так как я собираюсь уйти на день. Мое обоснование для того, чтобы быть последовательно быстрее, чем ваш SomeDummy.Xaml
Подход заключается в том, что я считаю, что TOOLBAR_ICON является нулевым ресурсом в каждой сборке. Таким образом, это будет прочитано очень рано в потоке. Faaaaaast. Так что это не просто исключение необходимости использования SomeDummy.Xaml в каждой сборке вашего проекта, которую я предлагаю; Я также рекомендую микрооптимизации.
Если эти приемы сработают, вы сможете значительно повысить производительность.
Дополнительные мысли:
Я думаю, вы можете очистить свой код дальше.
IModuleCatalog mm = this.UnityContainer.Resolve<IModuleCatalog>();
foreach (var module in mm.Modules)
{
может быть реорганизован для удаления ссылки на UnityContainer. Кроме того, IModuleCatalog будет создаваться через оболочку вокруг List<Module>
, который я упомянул в своем ответе на проблему 1. Другими словами, IModuleCatalog будет динамическим представлением всех загруженных модулей. Я предполагаю, что из этого дизайна можно добиться еще большей производительности, но, по крайней мере, вы больше не зависите от Unity. Это поможет вам лучше реорганизовать ваш код позже для увеличения производительности.