2015-05-18 5 views
0

У меня возникли трудности с пониманием того, почему нам нужен ComposeExportedValue (objval) вместо использования атрибута [Export].MEF ComposeExportedValue vs Export attribute

У меня есть объект приложения, созданный в оболочке, и этот объект приложения должен быть введен в призматические модули.

public class ShellBootsrapper : MefBootstrapper 
{ 

    [Export(typeof(IMyApplication))] 
    public MyApplication myApp; 

    protected override DependencyObject CreateShell() 
    { 
     this.Container.ComposeExportedValue<IMyApplication>(myApp); 
     return this.Container.GetExportedValue<Shell>(); 
    } 

    protected override void ConfigureAggregateCatalog() 
    { 
     base.ConfigureAggregateCatalog(); 
     myApp = new MyApplication(); 
     this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly())); 
     this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(Module1.Module1).Assembly)); 
} 

} 

Модуль 1 может импортировать только если я использую ComposeExportedValue<IMyApplication>(myApp);

[ModuleExport(typeof(Module1))] 
public class Module1 : IModule 
{ 

    private readonly IRegionManager regionManager; 


    [Import] 
    private IMyApplication myApp; 

}

Я бы ожидал [Export] достаточно, но, видимо, не?

Edit: Я удалил public MyApplication myApp; к shell.xaml.cs (более чувственный), из загрузчика и вещей получить работу. Я сделал вывод; В настоящее время разрабатывается состав MEF, и экспорт просто не работает. Вот почему призма внутренние L делают экспорт с ComposeExportedValue (объект Валом)

protected virtual void RegisterBootstrapperProvidedTypes() 
{ 
    this.Container.ComposeExportedValue<ILoggerFacade>(this.Logger); 
    this.Container.ComposeExportedValue<IModuleCatalog>(this.ModuleCatalog); 
    this.Container.ComposeExportedValue<IServiceLocator>(new MefServiceLocatorAdapter(this.Container)); 
    this.Container.ComposeExportedValue<AggregateCatalog>(this.AggregateCatalog); 
} 
+0

Я больше привык к тому, что модули вводятся в оболочку, а не наоборот. Вы действительно хотите вставить оболочку в модули? – Kryptos

+0

Спасибо за предложение. У меня есть небольшие модульные бизнес-приложения, кроме модулей призмы. Каждый модуль призмы должен регистрировать свой собственный модуль/объект приложения для малого бизнеса для основного бизнес-приложения, живущего в оболочке. Мне легче отправить ограниченный интерфейс (только для регистрации бизнес-объектов) на модули Prism. Модули Prism регистрируют свои бизнес-модули в основном бизнес-приложении с помощью этого предоставленного интерфейса. В противном случае; Я должен экспортировать/отправить все бизнес-модули в оболочку, и это не похоже, упростит ситуацию. – freewill

ответ

0

Я удалил public MyApplication myApp; к shell.xaml.cs (более чувственного), из загрузчика и вещей получить работу. Я сделал вывод; в начальной загрузке состава MEF и экспорт просто не работает. Вот почему призма внутренние L делают экспорт с ComposeExportedValue (объект валями)

protected virtual void RegisterBootstrapperProvidedTypes() 
{ 
    this.Container.ComposeExportedValue<ILoggerFacade>(this.Logger); 
    this.Container.ComposeExportedValue<IModuleCatalog>(this.ModuleCatalog); 
    this.Container.ComposeExportedValue<IServiceLocator>(new MefServiceLocatorAdapter(this.Container)); 
    this.Container.ComposeExportedValue<AggregateCatalog>(this.AggregateCatalog); 
} 

Также я нашел один из цели, для ComposeExportedValue должен сделать контролируемый экспорт; т. е. настроить объект, установить свойства и т. д., а затем экспортировать его. В противном случае MEF будет экспортировать только создание экземпляра.

Смежные вопросы