实现插件/模板系统c#

时间:2012-01-27 16:51:14

标签: c# templates dynamically-generated

我有一个相当简单的控制台应用程序,它可以监控交换邮箱,选择特定的电子邮件,并根据内容更新几个数据库。

我想实现几个类似的系统。虽然复制这个系统非常简单,但我正在寻找一个更复杂的解决方案 - 主要是智力练习,学习练习。

我想构建一个核心应用程序,定期从数据库中提取模板信息;此信息将告诉应用程序必须监视给定邮箱的特定时间间隔内具有给定特征的电子邮件。

我设想使用一些虚拟功能(预处理,处理项目,存档项目,发送通知等)创建主模板(程序集)。反过来,我会创建任意数量的模板来实现主模板中的接口,但在每种情况下功能可能会有很大不同,一个可能会更新数据库,而下一个可能会在文件系统中存储一些内容。

我的第一个问题是这是否是一个合理的实施?

我的第二个问题是如何动态引用每个模板,以及如何在适当的时候调用这些模板的方法?

如果我要扩展我的模板项目,为每个所需的新模板添加一个新类,我就克服了动态引用模板的问题。但是,如果我想将它们保存在单独的程序集中..有没有办法将它们放入项目中?不要忘记,模板将列在数据库中,因此应用程序会知道它们,但如何使用它们......

更新: 我想我如何动态引用每个模板类;它要求我提供Assembly-Qualified NameGetType: 我试图在主应用程序中动态生成模板:

string aqn= "MasterTemplates.TestTemplate, TestTemplate, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
MasterTemplate mt = (MasterTemplate)Activator.CreateInstance(Type.GetType(aqn));

因此,如果我不断更新我的MasterTemplates项目,根据需要添加新类,我就可以实现我的目标。 但是,如何处理不同的模板程序集?

与此同时,我将简要介绍DBM对Managed Extensibility Framework的建议。

结论: 我没有时间全面调查MEF;虽然这对我目前的需求来说太过分了,但它看起来非常有前途。我还没有想到如何为不同的模板轻松开发和使用不同的程序集 - 而是将所有模板保存在一个程序集中,每次需要新模板时我都必须重新编译和更新。不像MEF替代品那么复杂,但更简单,更适合我目前的需求。

2 个答案:

答案 0 :(得分:2)

您可以使用MEF动态加载插件。它在VS2010中处于开箱即用状态,非常适合动态加载组件。

答案 1 :(得分:1)

使用带字符串的激活器时,请使用Activator.CreateInstance(String,String)重载。

或者,您可以创建该类型的实例并使用它:

Activator.CreateInstance(Type.GetType(templateName));