前言

FastFrameWork 快速开发框架是一款基于敏捷并行开发思想和Microsoft .Net构件(插件)开发技术而构建的一个快速开发应用平台。用于帮助中小型软件企业建立一条适合市场快速变化的开发团队,以达到节省开发成本、缩短开发时间,快速适应市场变化的目的。

FastFrameWork 快速开发框架是适用于小型软件的一套快速开发解决方案。基于DevExpress16.1 开发,采用Ribbon UI设计风格,插件式扩展模块,配合Agile.Net数据访问组件与Agile.Net数据报表组件,能够快速的进行小型软件产品开发。

FFW.Data.dll 是数据访问组件是支持多种主流数据库的ORM,详细介绍

FFW.Report.dll 是数据报表组件提供报表打印、报表预览、报表设计、自定义报表数据源等二次开发功能,详细介绍

FastFrameWork 快速开发框架项目,已经托管在开源中国码云平台(http://gitee.com/MuNet/FastFrameWork

欢迎大家提意见,使用过程中如果有疑问或者想参与框架代码维护,请加入Agile.Net QQ交流群(10062867)。

首先展示一下运行界面:

项目代码结构:

下面我们介绍一下开发案例:

1.主界面设计

2.插件窗体设计

3.技术原理

主界面采用Ribbon风格,通过控制反转(IOC)将配置的插件载入框架中,并将插件窗体载入到框架容器窗体MDI区,合并插件窗体的RibbonPage与RibbonControl到框架容器窗体。

private void ribbon_Merge(object sender, DevExpress.XtraBars.Ribbon.RibbonMergeEventArgs e)
{
RibbonControl parentRRibbon = sender as RibbonControl;
RibbonControl childRibbon = e.MergedChild;
parentRRibbon.StatusBar.MergeStatusBar(childRibbon.StatusBar);
} private void ribbon_UnMerge(object sender, RibbonMergeEventArgs e)
{
RibbonControl parentRRibbon = sender as RibbonControl;
parentRRibbon.StatusBar.UnMergeStatusBar();
}

4.配置文件

每个插件可以包含多个窗体,每个窗体可以包含多个RibbonPage。

<?xml version="1.0" encoding="utf-8" ?>
<configuration> <configSections>
<sectionGroup name="spring">
<section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core" />
<section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
</sectionGroup>
</configSections> <spring>
<context>
<resource uri="config://spring/objects" />
</context>
<objects xmlns="http://www.springframework.net">
<description>An example that demonstrates simple IoC features.</description>
<!--name 必须要唯一的,type=类的全名称,所在的程序集-->
<object name="用户管理" type="Plugin.Employee.ChildForm1,Plugin.Employee" />
<object name="部门管理" type="Plugin.Dept.ChildForm2,Plugin.Dept" />
</objects>
</spring> <runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="Lib;"/>
</assemblyBinding>
</runtime> <system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite"/>
<add name="SQLite Data Provider" invariant="System.Data.SQLite" description="ADO.NET Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
<remove invariant="MySql.Data.MySqlClient"/>
<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data" />
<remove invariant="Oracle.ManagedDataAccess.Client"/>
<add name="Oracle Data Provider" invariant="Oracle.ManagedDataAccess.Client" description=".Net Framework Data Provider for Oracle" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess" />
<remove invariant="IBM.Data.DB2"/>
<add name="DB2 Data Provider" invariant="IBM.Data.DB2" description=".Net Framework Data Provider for DB2" type="IBM.Data.DB2.DB2Factory, IBM.Data.DB2" />
</DbProviderFactories>
</system.data> <!--数据库连接-->
<connectionStrings>
<add name="Default" providerName="Sqlite" connectionString="Data Source=|DataDirectory|Data.db;Version=3;"/>
<!--add name="Default" providerName="SqlServer" connectionString="Data Source=localHost;Initial Catalog=Agile;Integrated Security=SSPI;"/-->
</connectionStrings> </configuration>

5.数据访问类库的示例

public class Business
{
public static DataTable GetAllGrade()
{
var context = new FFW.Data.DataContext();
//方式1
//DataTable grades = context.Select<DataTable>("ID,Class,Level").From("Grade").QuerySingle();
//方式2
DataTable grades = context.Script("Select ID,Class,Level From Grade").QuerySingle<DataTable>();
return grades;
}
public static List<Student> GetAllStudent()
{
var context = new FFW.Data.DataContext();
return context.Script("Select ID,Name,Age From Student").QueryMany<Student>();
}
}

6.报表组件类库的示例

var report = new FFW.Report.ReportEx();
report.DataSources.Add("",Business.GetAllGrade());
report.DataSources.Add("Student", Business.GetAllStudent());
report.Parameters.Add("参数1", "FastFrameWork 快速开发框架");
report.Parameters.Add("参数2", DateTime.Now);
report.LoadFrom(Path.Combine(Application.StartupPath, "Report", "test.frx"));
report.Print();

结语

好了,通过以上简单的介绍后相信你对FastFrameWork 快速开发框架已经有一些认识了,如果你想对FastFrameWork 快速开发框架深入了解请下载完整源代码。

FastFrameWork 快速开发框架的更多相关文章

  1. CRL快速开发框架系列教程十三(嵌套查询)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  2. CRL快速开发框架系列教程十二(MongoDB支持)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  3. CRL快速开发框架系列教程十一(大数据分库分表解决方案)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  4. CRL快速开发框架系列教程十(导出对象结构)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  5. CRL快速开发框架系列教程九(导入/导出数据)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  6. CRL快速开发框架系列教程七(使用事务)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  7. CRL快速开发框架系列教程六(分布式缓存解决方案)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  8. CRL快速开发框架系列教程五(使用缓存)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  9. CRL快速开发框架系列教程三(更新数据)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

随机推荐

  1. HDU-5373 The shortest problem

    The shortest problem http://acm.hdu.edu.cn/showproblem.php?pid=5373 Time Limit: 3000/1500 MS (Java/O ...

  2. 安装Python及工具

    在Windows上安装Python 第一步:下载安装包 根据Windows版本(64或32)从Python官方网站下载对应的Python版本,此次使用python V3.5. 下载路径:https:/ ...

  3. 转(NLP必读)

    如果你刚接触自然语言处理并对她感兴趣,最好读几本这方面的书籍,除了能让你知道自然语言处理各个领域是干什么的外,还能培养一下NLP的感觉.以下四本书是我读研期间阅读和接触过的,如果您还有好书推荐,欢迎补 ...

  4. 完美atoi,哈哈

    /* atoi算法,要求完美版 有两种,一种是用longlong,一种是真用int “” " " “-” “+” “ -23” “ +23” “12a" "ab ...

  5. 微软 Build 2014开发者大会干货整理-1

    微软 Build 2014开发者大会第二天的主题演讲主要包含两部分:Microsoft Azure的发展状况,以及 .NET和生态系统的发展介绍.第二天的重点整理也由此分为上下两部分.您可以在Chan ...

  6. autoSvn

    #!/bin/bash    dir="/svndata" name="puppet" user="test" passwd="t ...

  7. HTML对JSON的操作

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  8. ios 添加到cell 上的button点击无效!扩大button的点击区域(黑魔法)

    一般情况下点击效果都是正常的!要不然你对它做了什么?一般细心的小伙伴都没有遇到这种情况,但是呢! 当然我是二班的!在这里我主要讲两个问题,解决问题和普及魔法. 一.普及问题(button在cell上点 ...

  9. jQuery获取Select选中的Text和Value,根据Value值动态添加属性

    语法解释:1. $("#select_id").change(function(){//code...}); //为Select添加事件,当选择其中一项时触发2. var chec ...

  10. apache配置directoryindex

    为了让程序自动执行目录下的某个文件,可以配置虚拟主机中的directoryindex 如: <VirtualHost *:80>    DocumentRoot "D:/var/ ...