【问题标题】:Flexible reporting system with dynamically loaded assemblies具有动态加载程序集的灵活报告系统
【发布时间】:2009-05-12 10:28:27
【问题描述】:

我想为我的应用程序构建一个灵活的报告系统。到目前为止,我脑子里只有一个概念,需要一些实施技巧。我正在使用 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 以便对其调用必要的方法?

你有没有实现过这样一个可扩展的系统?你能分享你的专业知识/代码sn-ps吗?

提前致谢。

编辑:

在调查这个问题时,我发现 Jon Skeet 在 Plug-ins and Cast Exceptions 上的文章可能会有所帮助。

【问题讨论】:

    标签: c# dll reporting add-in


    【解决方案1】:

    看到这个: Problem with dynamic loading of a dll into my program 在没有围绕它的所有 YAGNI 的情况下,正在做你想做的事。

    【讨论】:

    • 谢谢,gbianchi。 “使用反射进行动态加载”一文非常有帮助。
    【解决方案2】:

    查看Mono.Addins(它是 MIT 许可证,因此可以使用封闭软件)。根据您的描述,它可以满足您的需求。基本上它使用基于接口的依赖树+插件。它有自己的加载 .dll-s 管理器,它的对象基于加载的接口,所以你不需要更多的魔法转换来调用任何东西。

    【讨论】:

    • 感谢链接,病毒。似乎是一个非常好的信息来源。尽管如此,我还是想自己实现(不是在这里发明的综合症?)只是为了经验。
    【解决方案3】:

    你可以考虑微软的MEF。它是一个组合引擎,可以设置为监视本地文件夹并自动加载导出您感兴趣的部件的程序集(在您的情况下是 IReport 的实现)。 我们确实有一个类似我们之前实施的系统。我们有一个带有报告的程序集,我们将其加载到单独的应用程序域中,并在文件版本发生更改时重新加载。然后我们使用 .NET 远程处理在应用程序域之间进行通信。我们考虑使用 Microsoft 的插件框架,但我们发现它非常复杂和强大,因此认为它在我们的案例中过于繁重和复杂。

    【讨论】:

      猜你喜欢
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-24
      • 1970-01-01
      相关资源
      最近更新 更多