2016-05-08 13 views
2

Ich erhalte eine Fehlermeldung:Gibt es Probleme mit meinen MEF-Exporten?

An exception has occurred while trying to add a view to region 'MenubarRegion'. 
    - The most likely causing exception was was: 
     'Microsoft.Practices.ServiceLocation.ActivationException: Activation error occured 
     while trying to get instance of type MenuView, key "" ---> 

Mein Menü-Am setzt seine Datacontext durch MenuViewModel MEF mit, die inturn eine Instanz von IServiceFactory importiert. Ich bin sicher, dass ein Fehler aufgrund von IServiceFactory und MEF aufgetreten ist. ....... Ich meine Exporte darauf oder Importe. Ich denke, dass, wenn ich die ImportConstructor- und IServiceFactory-Deklarationen in MenuViewModel entferne, mein Programm gut funktioniert.

Ich habe auf MEF mit MefX auf Fehler überprüft. Hier sind die Ergebnisse:

enter image description here

enter image description here

enter image description here

Und hier ist mein Code:

MenuView.xaml.cs

[Export] 
[PartCreationPolicy(CreationPolicy.NonShared)] 
public partial class MenuView : UserControlViewBase 
{ 
    [ImportingConstructor] 
    public MenuView(MenuViewModel viewModel) 
    { 
     InitializeComponent(); 
     this.DataContext = viewModel; 
    } 
} 

MenuViewModel.cs

[Export] 
[PartCreationPolicy(CreationPolicy.NonShared)] 
public class MenuViewModel : ViewModelBase 
{ 

    IServiceFactory _ServiceFactory; 

    [ImportingConstructor] 
    public MenuViewModel(IServiceFactory serviceFactory) 
    { 
     _ServiceFactory = serviceFactory; 
    } 

    protected override void OnViewLoaded() 
    { 
     _MenuItems = new ObservableCollection<MenuItem>(); 

     WithClient<IMenuItemService>(_ServiceFactory.CreateClient<IMenuItemService>(), menuItemClient => 
     { 
      MenuItem[] menuItems = menuItemClient.GetAllParentMenuItemsWithChildren(); 
      if (menuItems != null) 
      { 
       foreach (MenuItem menuItem in menuItems) 
       { 
        _MenuItems.Add(menuItem); 
       } 

       _SelectedMenuItem = _MenuItems[2]; 
      } 

     }); 
    } 

    private ObservableCollection<MenuItem> _MenuItems; 

    public ObservableCollection<MenuItem> MenuItems 
    { 
     get 
     { 
      return _MenuItems; 
     } 
     set 
     { 
      if (_MenuItems != value) 
      { 
       _MenuItems = value; 
       OnPropertyChanged(() => MenuItems, false); 
      } 
     } 
    } 

    private MenuItem _SelectedMenuItem; 

    public MenuItem SelectedMenuItem 
    { 
     get 
     { 
      return _SelectedMenuItem; 
     } 
     set 
     { 
      if (_SelectedMenuItem != value) 
      { 
       _SelectedMenuItem = value; 
       OnPropertyChanged(() => SelectedMenuItem); 
      } 
     } 
    } 

} 

IServiceFactory.cs

public interface IServiceFactory 
{ 
    T CreateClient<T>() where T : IServiceContract; 
} 

ServiceFactory.cs

[Export(typeof(IServiceFactory))] 
[PartCreationPolicy(CreationPolicy.NonShared)] 
public class ServiceFactory : IServiceFactory 
{ 
    public T CreateClient<T>() where T : IServiceContract 
    { 
     return ObjectBase.Container.GetExportedValue<T>(); 
    } 
} 

Bootstrapper (Client-Seite):

public static class MEFLoader 
{ 
    public static CompositionContainer Init() 
    { 
     return Init(null); 
    } 

    public static CompositionContainer Init(ICollection<ComposablePartCatalog> catalogParts) 
    { 
     AggregateCatalog catalog = new AggregateCatalog(); 

     catalog.Catalogs.Add(new AssemblyCatalog(typeof(MenuItemClient).Assembly)); 
     catalog.Catalogs.Add(new AssemblyCatalog(typeof(MEFLoader).Assembly)); 

     if (catalogParts != null) 
      foreach (var part in catalogParts) 
       catalog.Catalogs.Add(part); 

     CompositionContainer container = new CompositionContainer(catalog); 

     return container; 
    } 
} 

Bootstrapper (Business Seite)

public static class MEFLoader 
{ 
    public static CompositionContainer Init() 
    { 
     AggregateCatalog catalog = new AggregateCatalog(); 

     catalog.Catalogs.Add(new AssemblyCatalog(typeof(MunimPlusEngine).Assembly)); 
     catalog.Catalogs.Add(new AssemblyCatalog(typeof(MenuItemManager).Assembly)); 
     catalog.Catalogs.Add(new AssemblyCatalog(typeof(MenuItemRepository).Assembly)); 
     catalog.Catalogs.Add(new AssemblyCatalog(typeof(MEFLoader).Assembly)); 

     CompositionContainer container = new CompositionContainer(catalog); 

     return container; 

    } 
} 

Bootstrapper (WPF Hauptanwendung)

public class BootStrapper : MefBootstrapper 
{ 
    protected override DependencyObject CreateShell() 
    { 
     return Container.GetExportedValue<Shell>(); 
    } 

    protected override void InitializeShell() 
    { 
     base.InitializeShell(); 
     App.Current.MainWindow = (Window)Shell; 
     App.Current.MainWindow.Show(); 
    } 

    protected override void ConfigureAggregateCatalog() 
    { 
     base.ConfigureAggregateCatalog(); 
     AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(BootStrapper).Assembly)); 
     AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(RegionNames).Assembly)); 
     AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(ModuleMenu.Module).Assembly)); 
    } 
} 

App.xaml.cs

public partial class App : Application 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    { 
     base.OnStartup(e); 

     ObjectBase.Container = MEFLoader.Init(new List<ComposablePartCatalog>() 
                { 
                 new AssemblyCatalog(Assembly.GetExecutingAssembly()) 
                }); 

     BootStrapper bootstrapper = new BootStrapper(); 
     bootstrapper.Run(); 

    } 
} 

Projekt

Hier ist mein Projekt, wenn jemand einen Blick an ihm haben möchte :

Download Project

+0

Haben Sie alle InnerExceptions dieser Ausnahme untersucht? – Evk

+0

@Evk Es gibt keine innere Ausnahme. – Vishal

+0

vielleicht ist es notwendig, einige Attribute an Ihrer Schnittstelle 'IServiceFactory' zu schreiben? Zum Beispiel: [Export] [PartCreationPolicy (CreationPolicy.NonShared)] '? – StepUp

Antwort

2

Das Problem ist, dass Ihre ServiceFactory Implementierung nicht zum MEF-Katalog hinzugefügt wird. Wenn Sie hinzufügen:

in Ihrer Bootstrapper-Konfiguration beendet die Anwendung beim Start Start Ausnahme. (aber es zeigt immer noch nichts)

Um diesen Typ hinzuzufügen, musste ich einen Verweis auf ein zusätzliches Projekt in der Hauptanwendung hinzufügen.

+2

Vielen Dank sir !!!!!! Du bist großartig. Ich habe die ServiceFactory-Implementierung im MEF-Katalog in der MEFLoader-Klasse auf der Clientseite hinzugefügt. Also, ich dachte, es war nicht notwendig, es in der Bootstrapper-Klasse hinzuzufügen. Du hast meinen Tag gerettet. Vielen vielen Dank. – Vishal

Verwandte Themen