2017-07-17 61 views
1

我使用这种方法来让我的C# - 应用扩展为其他开发商:访问数据

Creating a simple plugin mechanism

它工作得很好,但只有在“一个方向”,这意味着编写新插件的开发人员可以在插件中定义方法和变量,并将这些方法和变量导入到我的应用程序中。

所以我现在的问题是:我如何从插件中的主应用程序(例如变量“字符串测试”)访问已经存在的数据?

回答

0

您需要为您的应用程序创建一个可供插件编写人员使用的“SDK”。这应该包含任何你想使外部可访问的接口。

例如

MyAppSdk.dll

public interface IMyApplicationContext { 
    string SomeData { get; set; } 
    IMyAppService SomeService { get; set; } 
} 

public interface IPlugin { 
    void Do(IMyApplicationContext context) 
} 

插件

public class MyPlugin : IPlugin { 
    public void Do(IMyApplicationContext context) { 
     context.SomeService.DoAThing(); 
     System.Windows.MessageBox.Show(context.SomeData); 
    } 
} 

应用

context = GetApplicationContext(); 
plugin.Do(context); 
+0

你能详细解释一下“应用程序”部分吗?我做网络了解我如何访问我的插件中的信息。我已经在界面中用get/set变量尝试过了。然后,我想在插件的加载时将它的信息从我的应用程序中设置到插件中,然后在插件中找到它......但那并不奏效。 – Charbacca

+0

假设'IMyApplicationContext'位于您的应用程序和插件共享的程序集中,您可以在您的应用程序中实现它并将其传递给插件。你如何这样做取决于你,但我通常会建议DI。 – JamesT

0

有几种方法。

您可以创建一个Dictionary<string, object>,其中每个模块都有权设置或获取数据。您应该编写一些逻辑来访问该字典。例如一个T GetData<T>(string key)方法可以为它带来一个位类型的安全性。

您可以在PRISM框架中使用像EventAggregator这样的事件系统来启用模块之间的通信。

但请注意,这会使你的模块相互依赖。这就是为什么你应该处理如果数据不是来自另一个模块。

+0

我应该在哪里创建词典?在我的主要应用程序?但是,我的插件如何访问它呢? – Charbacca

+0

您应该在主应用程序中创建它,并且在创建它们时可以在模块中使用它:插入字典可用的类的实例(应该是单例实例)。 –

+0

我应该将mainApplication添加到插件的引用吗?否则,插件不知道我的主应用程序中的类,所以我不能插入它的一个实例。 – Charbacca