私は提案された実装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(...)
と呼んでいるのでしょうか?ヘルプは大歓迎です!
更新:
- 私のラップトップに切り替えた後、傍受は、以前働いていたことを、もう動作しません。さらに、私は今、私は
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
をロードしようとする場所から、どのように確認できますか?誰かが私を助けてくれることを願っています。私はゆっくりとそれを失っています。