CompositionHost.Initialize () не может выполняться дважды - PullRequest
1 голос
/ 28 июня 2011

В настоящее время я пытаюсь объединить MEF и PRISM для работы друг с другом.Пока все работает нормально.Теперь я хотел бы использовать обнаружение модуля времени выполнения MEF (DeploymentCatalog), который будет использоваться для загрузки XAP из каталога сервера, а затем подключить его к одному из регионов внутри моего MAIN UI.

Я использую UnityBootStrapper и внутри этогоКласс I также интегрированный контейнер MEF.Этот пример приложения основан на блоке Гленна (http://codebetter.com/glennblock/2010/01/03/mef-and-prism-exploration-mef-module-loading/).

. Следующий код используется для инициализации CompositionContainer внутри моего загрузчика:

     // This is the host catalog which contains all parts of running assembly.
        var catalog = GetHostCatalog();

        // Create MEF container which initial catalog
        var container = new CompositionContainer(catalog);


        // here we explicitly map a part to make it available on imports elsewhere, using
        // Unity to resolve the export so dependencies are resolved
        // We do this because region manager is third-party ... therefore, we need to 
        // export explicitly because the implementation doesn't have its own [export] tag
        container.ComposeExportedValue<IRegionManager>(Container.Resolve<IRegionManager>());
        container.ComposeExportedValue<IEventAggregator>(Container.Resolve<IEventAggregator>());

        // Obtain CatalogService as a singleton
        // All dynamic modules will use this service to add its parts.
        Container.RegisterInstance<ICatalogService>(new CatalogService(catalog));


        // Initialize the container
        CompositionHost.Initialize(container);

Теперь у меня есть другой класс, который называется DeploymentCatalogService, который используется для загрузки XAPс сервера. Текущая проблема, с которой я сталкиваюсь, заключается в том, что в методе инициализации DeploymentCatalogService контейнер CompositionHost пытается снова инициализировать свой контейнер с aggregateCatalog.

_aggregateCatalog = new AggregateCatalog();
        _aggregateCatalog.Catalogs.Add(new DeploymentCatalog());
        CompositionHost.Initialize(_aggregateCatalog);

Это вызывает исключение, в котором указано, что контейнер уже инициализирован..Есть ли способ использовать существующий контейнер и обновить его новым агрегатным каталогом?

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

Приветствия,

1 Ответ

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

Вы можете инициализировать контейнер только один раз. В вашем случае вы должны создать контейнер с AggregateCatalog и сохранить ссылку на этот каталог. Затем позже вы можете добавить DeploymentCatalog к этому AggregateCatalog.

...