0

プログラムの1つに独自のプラグインアーキテクチャを作成しました。

基本的に、プラグインは私のすべてのプラグインの基本クラスであり、PluginA:Plugin、PluginB:Pluginのようなプラグインがあると言います。

public class Plugin 
{
    private static Plugin _instance;
    public static Plugin Instance { get { return Plugin._instance; } }
}

いつものように、私のプラグインのそれぞれには、フォームや他のクラスのような他のものがあります。そのクラスから、次のような現在のプラグインインスタンスにアクセスしたいと思います。

Plugin.Instance.Settings()

プラグインctorで_instanceフィールドを割り当てる場合;

public Plugin(GlobalSettings gs, PluginSettings ps)
{
    Plugin._instance=this;
}

次に、ロードされたプラグインごとにインスタンスが上書きされ、PluginB.InstanceがPluginAのインスタンスを返すなどの奇妙な結果が得られます。

シングルトンがこれを行うのに完全に正しい方法ではないように思われることは知っていますが、私は別の解決策を思いつくことができませんでした。マルチトンでこれを解決できるかもしれませんが、プラグインライターに

Plugin.Instance["PluginB"] 

無関係のように見えるすべての時間。

助けてくれてありがとう。

4

2 に答える 2

0

staticキーワードを削除し、List<Plugin>それらをループし続けます。

于 2010-11-12T14:58:28.717 に答える
0

提案されているように、これらを何らかのリストに保存する必要があります。おそらくホスティングアプリケーションまたはライブラリに保存する必要があります。

'this'キーワードを使用して、現在のプラグインへの参照が既にあります。コンストラクターまたはメソッドを介して、これを他のクラスに渡すだけです。

お気に入り

public class MyPlugin :Plugin
{
    private MyClass myClass;

    public MyPlugin()
    {
         this.myClass = new MyClass(this);  
         this.myClass.DoSomething();
    }
    public void Something()
    {
         //Called back into from MyClass

    }
}
public class Myclass
{
     public Plugin OwnerPlugin {get;internal set;}
     public MyClass(Plugin ownerPlugin)
     {
           this.OwnerPlugin = ownerPlugin;
     }
     public void DoSomething()
     {
          //do something with ownerplugin
          this.OwnerPlugin.Something();
     } 
}
于 2010-11-12T15:39:58.543 に答える