繁体   English   中英

具有动态加载的程序集的灵活报告系统

[英]Flexible reporting system with dynamically loaded assemblies

我想为我的应用程序构建一个灵活的报告系统。 到目前为止,我脑子里只有一个概念,需要一些实现技巧。 我正在使用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的有关插件和演员表异常的文章可能会有所帮助。

看一下Mono.Addins (它是MIT许可证,因此对于封闭软件也可以)。 根据您的描述,它可以满足您的需求。 基本上,它使用基于接口的依赖树和插件。 它具有自己的已加载.dll-s管理器,并且其对象基于已加载的接口,因此您不需要任何魔术强制转换即可调用任何东西。

看到这个: 动态加载dll到我的程序中的问题正是您想要做的所有它周围的YAGNI。

您可以考虑从Microsoft获得MEF 它是一个合成引擎,可以设置为监视本地文件夹并自动加载用于导出您感兴趣的零件(在您的情况下为IReport的实现)的程序集。我们确实有一个类似我们之前实现的系统。 我们有一个带有报告的程序集,可以将报告加载到单独的应用程序域中,如果文件版本已更改,则可以重新加载。 然后,我们使用.NET远程处理在应用程序域之间进行通信。 我们曾考虑使用Microsoft的Add-in框架,但发现它非常复杂且令人印象深刻,因此决定在我们的案例中它过于繁琐。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM