2017-08-07 2 views
0

Ich habe einige Erweiterung Plugins im Plugins-Verzeichnis. Ich werde Plugins in ViewModel importieren und verwenden, aber ich kann es nicht erfolgreich importieren. Ich glaube, ich habe keine Möglichkeit, um erfolgreich die Konfiguration zu konfigurieren, suchen Sie RatWie Caliburn.micro MEF verwendet, um benutzerdefinierte Plugins zu importieren

Bootstrap.

public class AppBootstrapper : BootstrapperBase 
{ 
    private CompositionContainer container; 

    public AppBootstrapper() 
    { 
     Initialize(); 
    } 

    protected override void Configure() 
    { 
     string pluginPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "plugins"); 
     if (!Directory.Exists(pluginPath)) 
      Directory.CreateDirectory(pluginPath); 

     var fi   = new DirectoryInfo(pluginPath).GetFiles("*.dll"); 
     AssemblySource.Instance.AddRange(fi.Select(fileInfo => Assembly.LoadFrom(fileInfo.FullName))); 

     var catalog  = new AggregateCatalog(AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>()); 
     var batch   = new CompositionBatch(); 
     container   = new CompositionContainer(catalog); 

     batch.AddExportedValue(container); 
     batch.AddExportedValue<IWindowManager>(new WindowManager()); 

     batch.AddExportedValue<IEventAggregator>(new EventAggregator()); 
     batch.AddExportedValue(catalog); 

     container.Compose(batch); 
    } 

    protected override void BuildUp(object instance) 
    { 
     base.BuildUp(instance); 
    } 

    protected override object GetInstance(Type service, string key) 
    { 
     var contract = string.IsNullOrEmpty(key) ? AttributedModelServices.GetContractName(service) : key; 
     var exports = this.container.GetExportedValues<object>(contract); 

     if (exports.Any()) 
     { 
      return exports.First(); 
     } 

     throw new Exception(string.Format("Could not locate any instances of contract {0}.", contract)); 
    } 

    protected override IEnumerable<object> GetAllInstances(Type service) 
    { 
     return this.container.GetExportedValues<object>(AttributedModelServices.GetContractName(service)); 
    } 

    protected override void OnStartup(object sender, StartupEventArgs e) 
    { 
     DisplayRootViewFor<IShell>(); 
    } 
} 

Ansichtsmodell

[ImportMany] 
IEnumerable<Lazy<IPlugin, IPluginsMetaData>> plugins; 

Antwort

0

In der Tat, mein Bootstrapper und kein Problem, das Problem erscheint in meiner IPlugin-Klasse. Bei der Suche nach dem Problem fand ich auch Bootstrapper Configure-Methode auf andere Weise zu schreiben. Ich werde die gesamte Plug-in-Code setzen gebucht werden für alle neben dem ~

Bootstrap konfigurieren

protected override void Configure() 
{ 
    var catalog = new AggregateCatalog(AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>()); 
    var batch = new CompositionBatch(); 
    var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "plugins"); 

    if (!Directory.Exists(path)) 
     Directory.CreateDirectory(path); 

    catalog.Catalogs.Add(new DirectoryCatalog(path)); 
    container = new CompositionContainer(catalog); 

    batch.AddExportedValue(container); 
    batch.AddExportedValue<IWindowManager>(new WindowManager()); 

    batch.AddExportedValue<IEventAggregator>(new EventAggregator()); 
    batch.AddExportedValue(catalog); 

    container.Compose(batch); 
} 

ShellViewModel

[Export(typeof(IShell))] 
public class ShellViewModel : Conductor<object>, IShell 
{ 
    [ImportMany] 
    IEnumerable<Lazy<IPlugin, IPluginMetaData>> plugins; 
} 

IPlugin

beziehen sich auf
public interface IPlugin 
{ 
    void Do(); 
} 

public interface IPluginMetaData 
{ 
    string Name { get; } 

    string Code { get; } 

    //[... more attribute ...] 
} 

[MetadataAttribute] 
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] 
public class PluginExportAttribute : ExportAttribute, IPluginMetaData 
{ 
    public string Name { get; set; } 

    public string Code { get; set; } 

    //[... more attribute ...] 

    public PluginExportAttribute() : base(typeof(IPlugin)) { } 
} 

PluginOne

[PluginExport(Name = "PluginOne", Code = "Key")] 
public class PluginOne : IPlugin 
{ 
    public void Do() 
    { 
     Console.WriteLine("I'm PluginOne"); 
    } 
} 
Verwandte Themen