Slickflow.NET 开源工作流引擎基础介绍-.NET Core2.0 版本实现介绍

前言:.NET Core 是.NET Framework的新一代版本,是微软开发的第一个跨平台 (Windows、Mac OSX、Linux) 的应用程序开发框架(Application Framework),未来也将会支持 FreeBSD 与 Alpine 平台。.Net Core也是微软在一开始发展时就开源的软件平台,其开发目标是跨平台的 .NET 平台。

.NET Core 平台的开发优势 :

  1. 支持或可以移转 (port) 到更多的操作系统平台与芯片架构 (也就是未来项目会跨出 x86 平台)。

  2. 具有引人注目的性能与高可靠度。

  3. 开发人员能快速与直觉的获取 .NET Core 开发环境。

  4. 在直觉与具生产力的情况下建造应用程序,使用文件,示例与 NuGet 组件。

以上文字引用来源:https://zh.wikipedia.org/wiki/.NET_Core

1. .NET Core 2.0 迁移指南

    由于.NET Core跨平台开发和性能方面的优势,再加上.NET Core2.0版本的推出,越来越多的客户逐渐迁移到.NET Core框架进行软件系统的开发。Slickflow引擎组件的.NET Core版本的推出,也是为了解决跨平台引擎产品的实现。本文大致描述了创建.NET Core2.0 为目标版本类库,数据访问项目和Asp.NET Mvc Core等类型项目的搭建过程,方便用户快速上手。

1.1 数据访问项目

1) IRepository模式实现

    Repository模式实现通用数据访问接口,其好处是首先定义出标准的增删改查接口,其次可以满足对接后端不同的数据处理框架,如Dapper,EF和NHibernate等框架。

/// <summary>
/// 数据操作类接口
/// </summary>
/// <typeparam name="T">数据实体类型</typeparam>
public interface IRepository<T> where T : class
{
DbSet<T> GetDbSet();
T GetByID(dynamic id);
T Get(Expression<Func<T, bool>> predicate);
IQueryable<T> GetAll();
IQueryable<T> Query(string sql, params object[] parameters);
IEnumerable<T> Query(Expression<Func<T, bool>> predicate);
int Count(Expression<Func<T, bool>> predicate = null);
//insert, update, delete
T Insert(T entity);
void Insert(params T[] entities);
void Insert(IEnumerable<T> entities);
void Update(T entity);
void Update(params T[] entities);
void Update(IEnumerable<T> entities);
void Delete(dynamic id);
void Delete(params T[] entities);
void Delete(IEnumerable<T> entities);
}

2) UnitOfWork 解决事务

    引擎内部逻辑处理通常是多表的插入编辑操作,为保持数据事务完整性,需要实现会话事务的参数传递,提供提交和回滚的处理方式。Slickflow.Data.IDbSession用来实现UnitOfWork模式。

/// <summary>
/// 数据会话接口
/// </summary>
public interface IDbSession : IDisposable
{
DbContext DbContext { get; }
IRepository<T> GetRepository<T>() where T : class;
int SaveChanges();
int ExecuteSqlCommand(string sql, params object[] paramters);
}

代码示例:Session作为参数,传入具体接口方法,最终实现事务的一致提交或回滚。


/// <summary>
///  运行流程测试
/// </summary>
/// <param name="runner">运行者</param>
/// <returns>执行结果</returns>
[HttpPost]
public ResponseResult RunProcessApp([FromBody] WfAppRunner runner)
{
using (var session = DbFactory.CreateSession())
{
var transaction = session.DbContext.Database.BeginTransaction();
var wfService = new WorkflowService();
var result = wfService.RunProcessApp(runner, session);
if (result.Status == WfExecutedStatus.Success)
{
transaction.Commit();
return ResponseResult.Success();
}
else
{
transaction.Rollback();
return ResponseResult.Error(result.Message);
}
}
}

1.2 Asp.NET Mvc Core项目

1) Mvc和WebAPI路由统一配置

    通常在.NET项目开发中,Mvc项目用于前端页面展现,WebAPI用于后端接口实现。在项目实践过程中,可以将两个项目整合为一,便于环境配置。

app.UseMvc(route => {
route.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
route.MapRoute(
name:"defaultApi",
template: "api/{controller}/{action}/{id?}");
});


2) 数据库连接串配置

    数据库链接串在appsettings.json文件中进行定义,读取方法如下:

var dbType = ConfigurationExtensions.GetConnectionString(Configuration, "WfDBConnectionType");
var sqlConnectionString = ConfigurationExtensions.GetConnectionString(Configuration, "WfDBConnectionString");
Slickflow.Data.ConnectionString.DbType = dbType;
Slickflow.Data.ConnectionString.Value = sqlConnectionString;

3) DbContext 数据库类型匹配

    由于不同类型数据库的数据访问组件不同,所以特意做了接口对应匹配,传入数据库连接串值。

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (ConnectionString.DbType == DatabaseTypeEnum.SQLSERVER.ToString())
optionsBuilder.UseSqlServer(ConnectionString.Value);
else if (ConnectionString.DbType == DatabaseTypeEnum.MYSQL.ToString())
optionsBuilder.UseMySql(ConnectionString.Value);
else if (ConnectionString.DbType == DatabaseTypeEnum.ORACLE.ToString())
optionsBuilder.UseOracle(ConnectionString.Value);
}

2. EF Core对多数据库生成的支持

    EF Code First是由实体来生成数据库模型,简要过程描述为:首先定义好实体对象,对应数据库字段类型,然后执行EF Migrations的操作命令来生成数据库对象。其中经常用到的命令有:

   1) dotnet ef migrations add MyFirstMigraton

   2) dotnet ef migrations update database

   下面就以WfProcess表的创建来说明大致的创建过程。

2.1 MS SQLSERVER数据库

    采用的数据访问组件默认为:Microsoft.EntityFrameworkCore。

 1) 实体属性标识

/// <summary>
/// 流程实体类
/// </summary>
[Table("WfProcess")]
public class ProcessEntity
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column(Order = 0)]
public int ID { get; set; }
[Required]
[Column(TypeName = "varchar(100)", Order = 1)]
[MaxLength(100)]
public string ProcessGUID { get; set; }
[Required]
[Column(TypeName = "nvarchar(50)", Order = 2)]
[MaxLength(50)]
public string ProcessName { get; set; }
[Required]
[Column(TypeName ="nvarchar(20)", Order = 3)]
[MaxLength(20)]
public string Version { get; set; }
}

 2) 默认值赋值


//流程创建
modelBuilder.Entity<ProcessEntity>(entity =>
{
entity.Property(e => e.Version).HasDefaultValue("1");
entity.Property(e => e.IsUsing).HasDefaultValue(0);
entity.Property(e => e.StartType).HasDefaultValue(0);
entity.Property(e => e.EndType).HasDefaultValue(0);
entity.Property(e => e.CreatedDateTime).HasDefaultValueSql("getdate()");
});


 3) 生成命令执行

dotnet ef migrations add MyFirstMigration

2.2 MySQL数据库

    采用的数据访问组件默认为:Polemo.EntityFrameworkCore.MySQL。

  1) 实体属性标识

/// <summary>
/// 流程实体类
/// </summary>
[Table("WfProcess")]
public class ProcessEntity
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column(Order = 0)]
public int ID { get; set; }
[Required]
[Column(TypeName = "varchar(100)", Order = 1)]
[MaxLength(100)]
public string ProcessGUID { get; set; }
[Required]
[Column(TypeName = "varchar(50)", Order = 2)]
[MaxLength(50)]
public string ProcessName { get; set; }
[Required]
[Column(TypeName ="varchar(20)", Order = 3)]
[MaxLength(20)]
public string Version { get; set; }
}

 2) 默认值赋值 


//流程创建
modelBuilder.Entity<ProcessEntity>(entity =>
{
entity.Property(e => e.Version).HasDefaultValue("1");
entity.Property(e => e.IsUsing).HasDefaultValue(0);
entity.Property(e => e.StartType).HasDefaultValue(0);
entity.Property(e => e.EndType).HasDefaultValue(0);
});


 3) 生成命令执行

dotnet ef migrations add MyFirstMigration

3. Slickflow.WebAPI 快速测试

 3.1 路由模式选定:

    仍然选定传统路由模式,便于接口快速识别和匹配。

app.UseMvc(route => {
route.MapRoute(
name: "defaultApi",
template: "api/{controller}/{action}/{id?}");
});

3.2 数据库链接串读取:


var dbType = ConfigurationExtensions.GetConnectionString(Configuration, "WfDBConnectionType");
var sqlConnectionString = ConfigurationExtensions.GetConnectionString(Configuration, "WfDBConnectionString");
Slickflow.Data.ConnectionString.DbType = dbType;
Slickflow.Data.ConnectionString.Value = sqlConnectionString;

3.3 测试接口方法


/// <summary>
///  启动流程测试
/// </summary>
/// <param name="runner">运行者</param>
/// <returns>执行结果</returns>
[HttpPost]
public ResponseResult StartProcess([FromBody] WfAppRunner runner)
{
using (var session = DbFactory.CreateSession())
{
var transaction = session.DbContext.Database.BeginTransaction();
var wfService = new WorkflowService();
var result = wfService.StartProcess(runner, session);
if (result.Status == WfExecutedStatus.Success)
{
transaction.Commit();
return ResponseResult.Success();
}
else
{
transaction.Rollback();
return ResponseResult.Error(result.Message);
}
}
}

3.4 RestClient 测试工具

     引擎接口测试采用RestClient工具,比较方便快捷。通常采用统一的接口方法,将不同类型的流程JSON数据格式作为测试用例来提交测试。

4. 总结

     Slickflow 引擎产品的.NET Core版本实现,用于跨平台应用的项目开发和业务集成。而且在数据库的支持上,采用EF Core的Code First数据库迁移创建,方便用户开发环境的快速搭建和配置。


原文地址:http://www.cnblogs.com/slickflow/p/8250317.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321797.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DotNetty 跨平台的网络通信库

久以来,.Net开发人员都非常羡慕Java有Netty这样&#xff0c;高效&#xff0c;稳定又易用的网络通信基础框架。终于微软的Azure团队&#xff0c;使用C#实现的Netty的版本发布。不但使用了C#和.Net平台的技术特点&#xff0c;并且保留了Netty原来绝大部分的编程接口。让我们在使用…

26、临时表的创建和重复数据的处理

UPDATE student b SET b.sname dd WHERE b.id (SELECT a.id FROM student a WHERE a.id 3) Mysql中根据条件&#xff08;表A中的字段&#xff09;操作表A中的数据时是不可以的 所以借助临时表来删除/更新重复的数据&#xff0c;原理就是删除每组重复数据中除id值最大的其他…

1、java简介

关于java介绍也没什么好说的&#xff0c;在这里简单介绍一下&#xff0c;说起java&#xff0c;我第一想到的就是它的简单和强大&#xff0c;简单是简单易学&#xff0c;开发速度快&#xff1b;强大是其功能强大&#xff0c;各个领域都可使用&#xff0c;其代码一次编译可以处处…

C# 观察者模式 以及 delegate 和 event

观察者模式这里面综合了几本书的资料.需求有这么个项目: 需求是这样的:一个气象站, 有三个传感器(温度, 湿度, 气压), 有一个WeatherData对象, 它能从气象站获得这三个数据. 还有三种设备, 可以按要求展示气象站的最新数据.WeatherData的结构如下:有3个get方法, 分别获取最新的…

2、JAVA开发环境的搭建

上次说到java应用之所以做到跨平台&#xff0c;是因为其依赖于java虚拟机&#xff0c;java想要运行需要依赖于特定的运行环境&#xff0c;称为JRE&#xff0c;如果想要开发java应用&#xff0c;则需要用到开发工具包&#xff0c;也就是JDK&#xff0c;所以这里就要说一下这几者…

Serilog Tutorial

在过去的几年中&#xff0c;结构化日志已经大受欢迎。而Serilog是 .NET 中最著名的结构化日志类库 ,我们提供了这份的精简指南来帮助你快速了解并运用它。0. 内容设定目标认识Serilog事件和级别触发和收集结构化数据为过滤和关联添加事件标记大海捞针 [Finding needles in the …

使用DDD、事件风暴和Actor来设计反应式系统

领域驱动设计&#xff08;domain-driven design&#xff0c;DDD&#xff09;通常在微服务领域用于查找边界&#xff08;限界上下文&#xff09;。同样来自DDD的聚合&#xff08;aggregate&#xff09;对于定义持久化和一致性的范围来讲也是很重要的。 但是&#xff0c;并不是领…

站在巨人肩上的.NET Core 2.1

.NET Core 1.0自发布两年以来&#xff0c;得到了开发者群体相当高地认可。 下图来自Stack overflow survey 2018的统计&#xff1a;.NET Core已经成为前五的主流框架工具&#xff0c;现今借鉴了优秀的设计原则和开发体验可谓站在巨人肩上。这一切归功于.NET团队认识和总结了大量…

5、java中的数组

1、简介 数组是一种具有随机存取特性的数据结构&#xff0c;是内存上一段连续区域的表示&#xff0c;是实现顺序存储的基础&#xff0c;数组只能用于存储同一类型的数据。数组的长度在初始化时定义之后就不可更改&#xff0c;并且在初始化数组时必须指定数组的长度。 2、数组…

动态规划训练19、最短路 [Help Jimmy POJ - 1661 ]

Help Jimmy POJ - 1661 题意&#xff1a;大致是一个人从某个点开始下落&#xff0c;下落的速度是1m/s&#xff0c;然后在平台上的时候可以左右移动&#xff0c;移动的速度也是1m/s&#xff0c;但是这里有一个限制&#xff0c;就是说每次下落的距离不能超过一个给定的数值。问你…

【活动(北京)】Global Azure Bootcamp

活动议程活动内容08:30-08:50报到08:50-09:10活動开场Study4 - 陈科融(MVP)STB Chain Foundation - 劉海峰(MVP)MVP Program - Christina Liang(MVP CPM)09:10-10:00区块链让软件资产化成为现实刘海峰(MVP) - STBChain Foundation主席10:10-11:00基于Azure PaaS的网站应用刘元纶…

6、java中的排序算法

1、简介 排序是将元素按着指定关键字的大小递增或递减进行数据的排列&#xff0c;排序可以提高查找的效率 2、排序算法的分类 排序算法可大致分为四类七种&#xff0c;具体分类如下&#xff1a; 插入排序&#xff1a;直接插入排序、希尔排序 交换排序&#xff1a;冒泡排序、…

用.NET Core实现装饰模式和.NET Core的Stream简介

该文章综合了几本书的内容.某咖啡店项目的解决方案某咖啡店供应咖啡, 客户买咖啡的时候可以添加若干调味料, 最后要求算出总价钱.Beverage是所有咖啡饮料的抽象类, 里面的cost方法是抽象的. description变量在每个子类里面都需要设置(表示对咖啡的描述).每个子类实现cost方法, …

这个拖后腿的“in”

问题之源C# 7.2推出了全新的参数修饰符in&#xff0c;据说是能提升一定的性能&#xff0c;官方MSDN文档描述是&#xff1a;Add the in modifier to pass an argument by reference and declare your design intent to pass arguments by reference to avoid unnecessary copyin…

Surging 微服务框架使用入门

前言本文非 Surging 官方教程&#xff0c;只是自己学习的总结。如有哪里不对&#xff0c;还望指正。 我对 surging 的看法我目前所在的公司采用架构就是类似与Surging的RPC框架&#xff0c;在.NET 4.0框架上搭建Socket RPC&#xff0c;通过分组轮询的方式调度RPC&#xff0c;经…

RabbitMQ教程C#版 - 工作队列

先决条件本教程假定RabbitMQ已经安装&#xff0c;并运行在localhost标准端口&#xff08;5672&#xff09;。如果你使用不同的主机、端口或证书&#xff0c;则需要调整连接设置。从哪里获得帮助如果您在阅读本教程时遇到困难&#xff0c;可以通过邮件列表联系我们。1.工作队列&…

IdentityServer4实战 - 基于角色的权限控制及Claim详解

一.前言大家好&#xff0c;许久没有更新博客了&#xff0c;最近从重庆来到了成都&#xff0c;换了个工作环境&#xff0c;前面都比较忙没有什么时间&#xff0c;这次趁着清明假期有时间&#xff0c;又可以分享一些知识给大家。在QQ群里有许多人都问过IdentityServer4怎么用Role…

11、java中的I/O流(1)

我对于流的理解是这样的&#xff0c;计算机的本质本来就是对输入的数据进行操作&#xff0c;然后将结果输出的一种工具&#xff0c;数据在各个数据源节点之间进行流动&#xff0c;感觉流就是对这种状态的一种抽象&#xff0c;一个数据流表示的就是一系列数据序列&#xff0c;ja…

ASP.NET Core 集成测试

集成测试集成测试&#xff0c;也叫组装测试或联合测试。在单元测试的基础上&#xff0c;将所有模块按照设计要求&#xff08;如根据结构图&#xff09;组装成为子系统或系统&#xff0c;进行集成测试。实践表明&#xff0c;一些模块虽然能够单独地工作&#xff0c;但并不能保证…

使用C#开发Android应用之WebApp

近段时间了解了一下VS2017开发安卓应用的一些技术&#xff0c;特地把C#开发WebApp的一些过程记录下来&#xff0c;欢迎大家一起指教、讨论&#xff0c;废话少说&#xff0c;是时候开始表演真正的技术了。。1、新建空白Android应用2、拖一个WebView控件进来3、打开模拟器Genymot…