我使用这种方法来让我的C# - 应用扩展为其他开发商:访问数据
Creating a simple plugin mechanism
它工作得很好,但只有在“一个方向”,这意味着编写新插件的开发人员可以在插件中定义方法和变量,并将这些方法和变量导入到我的应用程序中。
所以我现在的问题是:我如何从插件中的主应用程序(例如变量“字符串测试”)访问已经存在的数据?
我使用这种方法来让我的C# - 应用扩展为其他开发商:访问数据
Creating a simple plugin mechanism
它工作得很好,但只有在“一个方向”,这意味着编写新插件的开发人员可以在插件中定义方法和变量,并将这些方法和变量导入到我的应用程序中。
所以我现在的问题是:我如何从插件中的主应用程序(例如变量“字符串测试”)访问已经存在的数据?
您需要为您的应用程序创建一个可供插件编写人员使用的“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);
有几种方法。
您可以创建一个Dictionary<string, object>
,其中每个模块都有权设置或获取数据。您应该编写一些逻辑来访问该字典。例如一个T GetData<T>(string key)
方法可以为它带来一个位类型的安全性。
您可以在PRISM框架中使用像EventAggregator
这样的事件系统来启用模块之间的通信。
但请注意,这会使你的模块相互依赖。这就是为什么你应该处理如果数据不是来自另一个模块。
你能详细解释一下“应用程序”部分吗?我做网络了解我如何访问我的插件中的信息。我已经在界面中用get/set变量尝试过了。然后,我想在插件的加载时将它的信息从我的应用程序中设置到插件中,然后在插件中找到它......但那并不奏效。 – Charbacca
假设'IMyApplicationContext'位于您的应用程序和插件共享的程序集中,您可以在您的应用程序中实现它并将其传递给插件。你如何这样做取决于你,但我通常会建议DI。 – JamesT