2016-10-14 12 views
0

私は提案された実装hereの後に、私たちのWPFプログラムのためのプラグインアーキテクチャを実装しようとしています。私は自分のプラグインをメインプログラムフォルダとは別のフォルダに置いて欲しい。私は部分的にしか働かないようにしました。この場合、プラグインタイプのみが部分的に登録されているのはなぜですか?

各プラグインは、独自のStructureMapレジストリを用意して、デフォルトのStructureMapレジストリを上書きする予定です。

私が現在取り組んでいるプラグインには、次のレジストリがあります。ご覧のとおり、プラグインタイプIPrintProgramExecutorのレジストリをオーバーライドして代わりにAutomationControllerを使用します。そして予想通り、それはに動作します:

public class PluginRegistry : Registry 
{ 
    public PluginRegistry() 
    { 
     this.ForConcreteType<AutomationController>() 
      .Configure 
      .Ctor<IPrintProgramExecutor>().Is(c=> c.GetInstance<PrintProgramExecutor>()) 
      .Singleton(); 
     this.For<IAutomationController>().Use(c => c.GetInstance<AutomationController>()).Singleton(); 
     this.For<IPrintProgramExecutor>().Use(c => c.GetInstance<IAutomationController>()).Singleton(); 
     //this.ForConcreteType<AutomationPlugin>() 
     // .Configure 
     // .Singleton(); 
     this.For<IPluginBase>().Use<AutomationPlugin>(); 
    } 
} 

AutomationPlugin現在、このスタブです:IPluginBase

public class AutomationPlugin : IPluginBase 
{ 
    public ViewModelBase ViewModel { 
     get { return viewModel; } 
     private set { viewModel = value; } 
    } 
    public ResourceDictionary View { get; } 

    private ViewModelBase viewModel { get; set; } 
    private ResourceDictionary viewDictionary = new ResourceDictionary(); 

    public AutomationPlugin() 
    { 
     // do something meaningfull! 
    } 
} 

public interface IPluginBase 
{ 
    ViewModelBase ViewModel { get; } 
    ResourceDictionary View { get; } 
} 

pluginPathがどこにあるか、レジストリを追加するためのクラスが、これです拡張フォルダへのパス:

予想されるように、上記プラグイン型 IPrintProgramExecutor作品の傍受を述べたように、今

public static class ExtensionManager 
{ 
    public static void RegisterPluginsInDic(string pluginPath, IContainer container) 
    { 
     var pluginRegistries = new PluginRegistryAdder(pluginPath); 
     container.Configure(_ => _.IncludeRegistry(pluginRegistries)); 
     var whatIHave = container.WhatDoIHave(typeof(IPluginBase)); 
     var plugins = container.Model.GetAllPossible<IPluginBase>(); // the IEnumberable plugins is empty although I am registering `AutomationPlugin` for it. Why?! 
    } 
} 

public class PluginRegistryAdder : Registry 
{ 
    public PluginRegistryAdder(string pluginPath) 
    { 
     Scan(x => 
     { 
      x.AssembliesFromPath(pluginPath); 
      x.LookForRegistries(); 
     }); 
    } 
} 

実際に上記のコードを使用して、プラグイン・レジストリに結びつけるためのクラスは、このです。しかし何らかの理由でcontainer.Model.GetAllPossible<IPluginBase>()container.WhatDoIHave(typeof(IPluginBase))プラグインタイプの登録タイプが見つからないIPluginBase。私はIPrintProgramExecutorのためにこれらのメソッドを呼び出すことを試みました、そして、確かに彼らは具体的な型を返します。私はかなりの理由でそれを見ていて、それを見つけることができません。

なぜでしょうか?事実、私はcontainer.Configure(...)を2度呼んでおり、おそらく私がすでにIPringProgramExecutorのために何かを登録しているという事実を、私がcontainer.Configure(...)と呼んでいるのでしょうか?ヘルプは大歓迎です!

更新:

  1. 私のラップトップに切り替えた後、傍受は、以前働いていたことを、もう動作しません。さらに、私は今、私はPluginRegistryに登録しようとしていますアセンブリの一つが発見されていないことを、例外を取得しています:

StructureMap.StructureMapException:レジストリタイプ「Extensions.Automationのインスタンスを作成することができません。 PluginRegistry '。詳細については内部例外を確認してください ---> System.Reflection.TargetInvocationException:例外が呼び出しのターゲットによってスローされました。 ---> System.IO.FileNotFoundException:ファイルまたはアセンブリ 'Automation.Servers.Interfaces、Version = 1.0.0.0、Culture = neutral、PublicKeyToken = null'またはその依存関係のいずれかをロードできませんでした。システムは、指定されたファイルを見つけることができません。 (Extensions.Automation.PluginRegistry..ctor() ...)

私は理解できないパスの問題のようです。私は、実行時にプログラムがメインパスからPlugin-registryにDLLをロードしようとしますが、対応するDLL/assebliesがExtension-folderに存在すると考えられます。 StructureMapがデバッグのためにアセンブリAutomation.Servers.Interfacesをロードしようとする場所から、どのように確認できますか?誰かが私を助けてくれることを願っています。私はゆっくりとそれを失っています。

答えて

0

あなたはのStructureMapは型スキャン診断とのアセンブリをプローブしようとしている場所を確認することができる必要があります:http://structuremap.github.io/diagnostics/type-scanning/

あなたが代わりのAppDomain/AppContextをに頼るのフォルダを指定する機能を持っています。