2012-01-27 59 views
0

我有一个相当简单的控制台应用程序,用于监视交换邮箱,挑选特定电子邮件并根据内容更新几个数据库。实现插件/模板系统c#

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

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

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

我的第一个问题是这是否是一个明智的实现?

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

如果我要扩展我的模板项目,为每个需要的新模板添加一个新类,我会克服动态引用模板的问题。但如果我想让他们在单独的程序集中。有没有办法将它们放入项目中?不要忘了,这些模板将在DB上市,因此应用程序将意识到它们,而是如何利用它们...

UPDATE: 我已经找到了我怎么能动态引用每个模板类;它要求我提供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对托管扩展框架的建议。

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

+0

的typeof(),使得在当前的背景下,在编译时已知的和可用的类型感。例如。 typeof(string),typeof(System.Int32)。注意缺乏引号。什么woni建议似乎是适当的。 – pbalaga 2012-01-27 20:27:31

回答

1

当使用字符串激活器时,请使用Activator.CreateInstance(String,String)过载。

另外,您可以创建类型的实例,并使用它像:

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

我的OP没有正确的代码片段 - 我已经更新了它。然而,我已经尝试过'Type.GetType(templateName)',它给出了与'typeof(templatename)'相同的结果 - * templateName是一个字段,但是像一个类型一样使用* – CJM 2012-01-27 18:57:33

+0

你能检查错误的行吗?在这种情况下不太可能发生。 – dwonisch 2012-01-27 19:03:33

+0

@CJM:该错误是语法错误。我会尝试一种更简单的形式(即使是在一个小型测试项目中),以确保您的语法正确。例如'var test =“System.Int32”; var result = Type.GetType(test)'。 – Guvante 2012-01-27 19:11:29

2

您可以使用MEF动态加载插件。它是VS2010中的箱子,适用于动态加载程序集。

+0

低调的护理人员会解释为什么MEF是一个不合适的建议? – CJM 2012-01-27 18:51:57