在处理数据的.NET应用程序中,最终都需要一种方式将数据以用户友好的方式展示出来。这时,报告生成器就显得尤为重要。它们提供了快速便捷的方法,可以直接在Visual Studio内部连接到不同类型的数据源。通过报告设计器,可以创建和调整布局模板,并最终打印到多种不同的导出格式,如PDF、XHTML、Microsoft Excel或Microsoft Word。在许多情况下,也希望将设计器提供给应用程序的最终用户。
在开始报告之前,需要有数据可用。由于应用程序通常使用特定格式的数据,组件应该能够直接从那里开始。这就需要尽可能广泛地支持各种数据格式。
选择报告和分析的数据源,绑定到标准的.NET数据源。ADO.NET提供了一个统一的驱动模型,将Visual Studio连接到.NET数据源。List & Label支持所有标准源,如Microsoft SQL Server、PostgreSQL、MySql或SQLite。同样,直接支持基于云的数据源,如Azure CosmosDB或REST。当然,标准的ADO数据对象,如DataSet、DataTable或DataViewManager也不能遗漏。
支持是通过一个单独的接口IDataProvider实现的。这个抽象层也使用户能够为以前不支持的数据源贡献自己的额外数据提供者。combit还将此作为开源项目的一部分,例如在GitHub上。List & Label周围的生态系统是开放的,并邀请社区参与和扩展。
除了上述数据源外,List & Label使用反射来支持绑定到业务对象。这也提供了重要的额外灵活性。用户可以与他们在Visual Studio代码中也使用的类和对象一起工作。.NET提供了一些接口,如IBindingListView或IQueryable/LINQ,支持扩展绑定,包括排序和过滤。在这里提供尽可能广泛的支持至关重要——毕竟,组件应该适应现有的数据,而不是反过来。
Entity Framework或更一般地,ORM(对象关系映射)工具抽象了业务对象到数据库的序列化。通常的CRUD操作可以在对象级别执行,而ORM工具提供了必要的持久性。相应地,绑定到EF对象就是绑定到业务对象。出于性能原因,组件应该支持各自ORM框架的现有延迟加载技术,以避免不必要的数据库流量和内存消耗。List & Label支持这些场景。
一旦建立了与数据源的连接,就可以从Visual Studio内部调用报告设计器。必须确保对各种项目类型(如WinForms、WPF或ASP.NET)提供最佳支持。报告应该可以在这些类型之间互换,以支持桌面应用程序的轻松云迁移。这就是List & Label所做的。
在Windows应用程序中,无论是WPF还是WinForms,设计器都可以作为一个单独的窗口启动。许多报告生成器在这里提供一个直接的Visual Studio设计器。List & Label采取了不同的方法,通过提供一个独立的窗口来提供设计器。优点是:所有的编辑器、对话框等都可以单独适应和优化,以方便最终用户。此外,它不需要在最终用户现场的Visual Studio外壳。开发者和最终用户使用的报告设计器是相同的。如果用户不应该拥有所有可能性,可以有意识地限制功能。
实际调用设计器是一个ListLabel类的方法。连接到SQL数据源的最小代码以及随后的设计如下:
var builder = new SqlConnectionStringBuilder();
builder.DataSource = "dbserver";
builder.InitialCatalog = "CustomerData";
var connection = new SqlConnection(builder.ConnectionString);
var sqlProvider = new SqlConnectionDataProvider(connection);
using (var LL = new ListLabel())
{
LL.DataSource = sqlProvider;
LL.Design();
}
对于Web应用程序,拥有对不同前端技术的最广泛支持是很重要的。前端依赖于所使用的组件是没有意义的。另一方面,组件必须能够处理所有常见的JavaScript框架。List & Label依赖于WebComponent技术,确保了最佳支持。为了更容易开始,包括了一些示例,展示了如何在Visual Studio Code中与React、Angular、Vue.js或Blazor等一起使用该组件。对于后端,该组件依赖于ASP.NET MVC,这是最常见的后端技术之一。这确保了用户拥有最大的灵活性。
只需要实现一个控制器就可以打开Web报告设计器。代码如下:
public override void OnProvideListLabel(ProvideListLabelContext provideListLabelContext)
{
var sqlProvider = new SqlConnectionDataProvider(...);
ListLabel LL = new ListLabel();
LL.DataSource = sqlProvider;
provideListLabelContext.NewInstance = LL;
}
组件由一组需要重新分发到目标计算机的二进制文件组成。有很多不同的方法——这样做时,组件制造商应该确保重新分发尽可能简单和万无一失,以避免不必要的挫折。以下是List & Label支持的一些可能性。
XCopy部署:这是共享的最简单方式。二进制文件不需要注册或安装,文件可以直接复制到目标计算机。combit甚至包括一个重新分发向导。它允许从可选组件中选择,然后自动创建一个包含所需二进制文件的ZIP存档。这些与应用程序一起复制到目标计算机。这再简单不过了。
NuGet支持:另一种选择是使用包管理器。对于Visual Studio和.NET程序集,NuGet是首选格式。当使用NuGet包时,所有所需的二进制文件都会在编译器的输出目录中创建。结果可以从那里复制或处理。对于用户来说,这也是一个非常简单的方法,即使是复杂的依赖关系也能处理。