2017-08-07 19 views
0

プラグインディレクトリにいくつかの拡張プラグインがあります。 ViewModelでプラグインをインポートして使用する予定ですが、インポートは正常にできません。私は助言を求める、私が正常に設定を設定する方法がありませんだと思うCaliburn.microがMEFを使用してカスタムプラグインをインポートする方法

ブートストラップ:実際に

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>(); 
    } 
} 

のViewModel

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

答えて

0

、私のブートストラップと問題なし、問題が表示されます私のIPluginクラスで。問題を発見する過程で、私はBootstrapper Configureメソッドが別の方法で書かれていることも発見しました。誰もが次〜

ブートストラップ設定

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

を参照するために私が掲載されているプラ​​グイン全体のコードを配置します
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"); 
    } 
} 
関連する問題