У меня есть простая иерархия контейнеров с родительским контейнером, который определен в Shell MEFBootstrapper с использованием каталога Directory, и дочерние контейнеры, которые создаются из родительского с отдельным каталогом.
Мои дочерние контейнеры также используют DirectoryCatalog (путь отличается от родительского), и я вижу, что контейнер содержит информацию о сборке и детали во время выполнения.
Однако метод Initialize () для модулей, расположенных в дочерних контейнерах, никогда не вызывается.
Моя цель - использовать дочерние контейнеры в качестве конструкций сеансов, позволяя пользователю создавать новые сеансы и переключаться между ними. Но если я не могу заставить составные модули инициализировать (и разместить их представления в регионах), я как бы застрял.
Я подумал вызвать событие из моего менеджера сеансов с помощью агрегатора событий, чтобы модули могли прослушивать событие и самостоятельно инициализироваться, но, похоже, это тоже не сработало.
я. Почему при инициализации не вызывается вызов модулей, загруженных в дочерний контейнер
II. Как я могу «инициировать» инициализацию из экземпляра контейнера (вне контекста модуля?) Можете ли вы перебрать сборки в контейнере и вызвать инициализацию таким образом ???
[из MefBootstrapper в проекте оболочки]
protected override DependencyObject CreateShell()
{
ExportProvider ep = this.Container as ExportProvider;
this.Container.ComposeExportedValue(ep);
[из службы, управляющей моими сеансами (контейнерами)]
[ImportingConstructor]
public SessionService(ExportProvider provider)
{
[конструктор для новых сессий (контейнеров)]
private void Init(ComposablePartCatalog catalog, ExportProvider provider, string name, int callId, bool useContextProxy)
{
this._Name = name;
this._CallID = callId;
this.startTime = DateTime.Now;
this.appHost = new CompositionContainer(catalog, new ExportProvider[] { provider });
}
=====
Меня попросили включить код моего модуля, метод инициализации которого не вызывается (несмотря на загрузку в рассматриваемый контейнер ... Я могу даже лениво создать экземпляр модуля, но вызов Initialize () напрямую вызывает сбой операции инъекции в правильный метод.
namespace Module1
{
//, InitializationMode = InitializationMode.OnDemand
[ModuleExport("Module1.ModuleInit", typeof(Module1.ModuleInit))]
public class ModuleInit : IModule
{
private readonly IRegionManager _regionManager;
public IServiceLocator _serviceLocator;
[ImportingConstructor]
public ModuleInit(IRegionManager regionManager, IServiceLocator serviceLocator)
{
_regionManager = regionManager;
_serviceLocator = serviceLocator;
}
#region IModule Members
public void Initialize()
{
// Use View Discovery to automatically display the MasterView when the TopLeft region is displayed.
_regionManager.RegisterViewWithRegion(RegionNames.TopLeftRegion, () => _serviceLocator.GetInstance<MasterView>());
}
#endregion
}
}