2010-11-12 38 views
0

我为我的一个程序创建了自己的插件体系结构。c# - 为内部作用域代码实现插件实例属性

Basicly Plugin是我所有插件的基类,并说我有插件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"] 

这似乎无关紧要的所有时间。

感谢您的任何帮助。

回答

0

如上所述,您应该将它们存储在某种列表中,可能位于托管应用程序或可能位于库中。

您已经对当前插件的引用,用“这个”关键字,只要通过构造函数或方法传递这个到你的其他类:

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

是的,这是一个解决方案,但与该方法的问题是 - 让我解释一下;我有一个名为LibEvents的插件,它从XML源读取一些事件,它包含大量条目。我认为所有插件实例都是通过插件实现的,这些插件实际上是废话并且来自一个插件 - 开发人员的观点可能会让事情变得复杂。 – HuseyinUslu 2010-11-12 15:46:56

0

删除static关键字并保留List<Plugin>以使其循环。

+0

我不想插件看到对方的实例。 – HuseyinUslu 2010-11-12 15:05:18

+0

和我删除static关键字,插件助手类将无法访问它。 – HuseyinUslu 2010-11-12 15:14:05