我想为我的应用程序构建灵活的报告系统。到目前为止,我只有一个概念,需要一些实施技巧。我正在使用Crystal Reports来呈现报告,我知道如何动态加载报告。
现在,我们的想法是每个报告都将打包为一个单独的程序集(.dll)。报告框架将加载每个自定义报告,并通过明确定义的界面与其进行通信,如下所示:
public interface IReport
{
string GetTitle();
string GetDescription();
void SetParameter();
void Print();
}
此外,将有一些基本实现(作为抽象类)将处理报告上的一些常见操作(如绑定到数据源等):
public abstract class Report
{
...
}
在每个dll中都会有一个具体类的实现,代表这个或那个报告:
public class CustomersReport : Report
{
...
}
现在,我必须弄清楚以下内容:
1)如何动态定位和加载dll?
2)如何创建具体类(CustomerReport)的实例并将其强制转换为IReport以便在其上调用必要的方法?
你有没有实现过这样一个可扩展的系统?您能否分享一下您的专长/代码片段?
提前致谢。
编辑:
在调查这个问题时,我发现Jon Skeet关于Plug-ins and Cast Exceptions的文章可能会有所帮助。
答案 0 :(得分:1)
查看Mono.Addins(这是麻省理工学院的许可证,因此可以使用封闭式软件)。根据您的描述,它可以满足您的需求。基本上它使用基于接口的依赖树+插件。它有自己的加载.dll-s管理器,它的对象基于加载的接口,所以你不需要任何魔法转换来调用任何东西。
答案 1 :(得分:1)
看到这个: Problem with dynamic loading of a dll into my program 如果没有围绕它的所有YAGNI,你正在做你想要的。
答案 2 :(得分:0)
您可以考虑来自Microsoft的MEF。它是一个组合引擎,可以设置为监视本地文件夹并自动加载导出您感兴趣的部件(在您的情况下实现IReport)的程序集。 我们确实有一个类似于我们之前实施的系统。我们有一个包含报告的程序集,我们将其加载到单独的应用程序域中,并在文件版本发生更改时重新加载。然后我们使用.NET远程处理在应用程序域之间进行通信。我们考虑使用Microsoft的Add-in框架,但我们发现它非常复杂且非常复杂,并且在我们的案例中认为它过于繁重和复杂。