在 C# 中为服务器应用程序实现自定义上下文
Implementing a custom context in C# for server application
我正在实现一个基于插件的服务器架构,希望插件能够了解服务器状态,并有一个向服务器报告状态和结果的通用方法。
我的意图是定义一个上下文,在调用每个插件时将其传递给每个插件,插件会将状态信息报告回上下文。
然后上下文将用于跟踪每个插件执行的每个任务的状态。
是否有在 C# 中创建自定义上下文的标准,或者是否有可以使用的通用 Context
对象?
上下文需要做的只是存储属性,但我不确定哪个上下文 class 最适合扩展或按原样使用。
在这种情况下,上下文将包含
1) 每个插件读取的一组共享属性将管理它们的执行(数据库地址、用于查找要处理的项目的文件夹名称等)
2) 包含插件的 Execute
方法
产生的结果的字典
3) 关于进程 success/failure 的状态信息
4) 进程当前状态的记录(来自枚举的值)
我打算为此使用一个基本对象,但由于 C# 的各种库中有许多 Context
class,我正在考虑是否扩展现有的 Context
object 比从头开始写一个更好的选择。
查看 MSDN 上的文献,这两种方法似乎都没有多少先例,如果已经这样做过的人提供任何反馈,我将不胜感激。
不要使用 global/static 上下文。它使维护和测试您的应用程序变得更加困难。
相反,您可以定义上下文并在插件初始化期间将其作为实例传递给插件。类似于:
public interface IPlugin
{
void Init(ApplicationContext context)
// [.. other methods that plugins must implement ..]
}
就像那样,您拥有相同的功能,但不必考虑 [ThreadStatic]
和异步上下文。
I'm intending to use a basic object for this, but as there are a number of Context classes in various libraries for C#, I'm debating whether extending an existing Context object would be a better choice than just writing one from scratch.
我觉得还是从头开始写比较好。不要那个上下文 类 倾向于增长并向 GOD 对象移动。通过自己制作一个,您可以保持它的小巧。
上下文对象的替代方法是将小型服务公开给它们可以使用的插件。这样做的一个好方法是使用控制反转容器来构建实现 IPlugin
接口的 类。
通过这种方式,他们可以简单地使用依赖注入来直接获取应用程序服务(他们的合同,即接口)。
类似于:
//register the plugins in the container
var plugins = Directory.GetFiles(yourAppDirectory, "plugin_*.dll");
foreach (var pluginDll in plugins)
{
var assembly = Assembly.Load(pluginDll);
var pluginType = assembly.GetTypes().FirstOrDefault(x=> typeof(IPlugin).IsAssignableFrom(x));
yourContainer.RegisterType(pluginType, typeof(IPlugin));
}
最后加载它们:
var plugins = container.ResolveAll<IPlugin>();
foreach(var plugin in plugins)
plugin.Init();
插件可以这样定义:
public class HelpPlugin : IPlugin, IMenuHandler
{
public HelpPlugin(IMenuService service)
{
service.AddTopMenu("Help", this);
}
void IMenuHandler.Handle(MenuClick click)
{
MessageBox.Show("Menu button was clicked");
}
}
耶!不需要上下文对象。
我正在实现一个基于插件的服务器架构,希望插件能够了解服务器状态,并有一个向服务器报告状态和结果的通用方法。
我的意图是定义一个上下文,在调用每个插件时将其传递给每个插件,插件会将状态信息报告回上下文。 然后上下文将用于跟踪每个插件执行的每个任务的状态。
是否有在 C# 中创建自定义上下文的标准,或者是否有可以使用的通用 Context
对象?
上下文需要做的只是存储属性,但我不确定哪个上下文 class 最适合扩展或按原样使用。
在这种情况下,上下文将包含
1) 每个插件读取的一组共享属性将管理它们的执行(数据库地址、用于查找要处理的项目的文件夹名称等)
2) 包含插件的 Execute
方法
3) 关于进程 success/failure 的状态信息
4) 进程当前状态的记录(来自枚举的值)
我打算为此使用一个基本对象,但由于 C# 的各种库中有许多 Context
class,我正在考虑是否扩展现有的 Context
object 比从头开始写一个更好的选择。
查看 MSDN 上的文献,这两种方法似乎都没有多少先例,如果已经这样做过的人提供任何反馈,我将不胜感激。
不要使用 global/static 上下文。它使维护和测试您的应用程序变得更加困难。
相反,您可以定义上下文并在插件初始化期间将其作为实例传递给插件。类似于:
public interface IPlugin
{
void Init(ApplicationContext context)
// [.. other methods that plugins must implement ..]
}
就像那样,您拥有相同的功能,但不必考虑 [ThreadStatic]
和异步上下文。
I'm intending to use a basic object for this, but as there are a number of Context classes in various libraries for C#, I'm debating whether extending an existing Context object would be a better choice than just writing one from scratch.
我觉得还是从头开始写比较好。不要那个上下文 类 倾向于增长并向 GOD 对象移动。通过自己制作一个,您可以保持它的小巧。
上下文对象的替代方法是将小型服务公开给它们可以使用的插件。这样做的一个好方法是使用控制反转容器来构建实现 IPlugin
接口的 类。
通过这种方式,他们可以简单地使用依赖注入来直接获取应用程序服务(他们的合同,即接口)。
类似于:
//register the plugins in the container
var plugins = Directory.GetFiles(yourAppDirectory, "plugin_*.dll");
foreach (var pluginDll in plugins)
{
var assembly = Assembly.Load(pluginDll);
var pluginType = assembly.GetTypes().FirstOrDefault(x=> typeof(IPlugin).IsAssignableFrom(x));
yourContainer.RegisterType(pluginType, typeof(IPlugin));
}
最后加载它们:
var plugins = container.ResolveAll<IPlugin>();
foreach(var plugin in plugins)
plugin.Init();
插件可以这样定义:
public class HelpPlugin : IPlugin, IMenuHandler
{
public HelpPlugin(IMenuService service)
{
service.AddTopMenu("Help", this);
}
void IMenuHandler.Handle(MenuClick click)
{
MessageBox.Show("Menu button was clicked");
}
}
耶!不需要上下文对象。