Slickflow.NET 开源工作流引擎基础介绍-.NET Core2.0 版本实现介绍
前言:.NET Core?是.NET Framework的新一代版本,是微軟開發(fā)的第一個跨平臺 (Windows、Mac OSX、Linux) 的應用程序開發(fā)框架(Application Framework),未來也將會支持?FreeBSD?與?Alpine?平臺。.Net Core也是微軟在一開始發(fā)展時就開源的軟件平臺,其開發(fā)目標是跨平臺的 .NET 平臺。
.NET Core 平臺的開發(fā)優(yōu)勢 :
支持或可以移轉(zhuǎn) (port) 到更多的操作系統(tǒng)平臺與芯片架構(gòu) (也就是未來項目會跨出 x86 平臺)。
具有引人注目的性能與高可靠度。
開發(fā)人員能快速與直覺的獲取 .NET Core 開發(fā)環(huán)境。
在直覺與具生產(chǎn)力的情況下建造應用程序,使用文件,示例與 NuGet 組件。
以上文字引用來源:https://zh.wikipedia.org/wiki/.NET_Core
1. .NET Core 2.0 遷移指南
? ? 由于.NET Core跨平臺開發(fā)和性能方面的優(yōu)勢,再加上.NET Core2.0版本的推出,越來越多的客戶逐漸遷移到.NET Core框架進行軟件系統(tǒng)的開發(fā)。Slickflow引擎組件的.NET Core版本的推出,也是為了解決跨平臺引擎產(chǎn)品的實現(xiàn)。本文大致描述了創(chuàng)建.NET Core2.0 為目標版本類庫,數(shù)據(jù)訪問項目和Asp.NET Mvc Core等類型項目的搭建過程,方便用戶快速上手。
1.1 數(shù)據(jù)訪問項目
1) IRepository模式實現(xiàn)
? ? Repository模式實現(xiàn)通用數(shù)據(jù)訪問接口,其好處是首先定義出標準的增刪改查接口,其次可以滿足對接后端不同的數(shù)據(jù)處理框架,如Dapper,EF和NHibernate等框架。
/// <summary>/// 數(shù)據(jù)操作類接口/// </summary>/// <typeparam name="T">數(shù)據(jù)實體類型</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, deleteT 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 解決事務
? ? 引擎內(nèi)部邏輯處理通常是多表的插入編輯操作,為保持數(shù)據(jù)事務完整性,需要實現(xiàn)會話事務的參數(shù)傳遞,提供提交和回滾的處理方式。Slickflow.Data.IDbSession用來實現(xiàn)UnitOfWork模式。
/// <summary>/// 數(shù)據(jù)會話接口/// </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作為參數(shù),傳入具體接口方法,最終實現(xiàn)事務的一致提交或回滾。
1.2 Asp.NET Mvc Core項目
1) Mvc和WebAPI路由統(tǒng)一配置
? ? 通常在.NET項目開發(fā)中,Mvc項目用于前端頁面展現(xiàn),WebAPI用于后端接口實現(xiàn)。在項目實踐過程中,可以將兩個項目整合為一,便于環(huán)境配置。
app.UseMvc(route => {route.MapRoute(name:?"default",template:?"{controller=Home}/{action=Index}/{id?}");route.MapRoute(name:"defaultApi",template:?"api/{controller}/{action}/{id?}");});2) 數(shù)據(jù)庫連接串配置
? ? 數(shù)據(jù)庫鏈接串在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 數(shù)據(jù)庫類型匹配
? ? 由于不同類型數(shù)據(jù)庫的數(shù)據(jù)訪問組件不同,所以特意做了接口對應匹配,傳入數(shù)據(jù)庫連接串值。
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對多數(shù)據(jù)庫生成的支持
? ??EF Code First是由實體來生成數(shù)據(jù)庫模型,簡要過程描述為:首先定義好實體對象,對應數(shù)據(jù)庫字段類型,然后執(zhí)行EF Migrations的操作命令來生成數(shù)據(jù)庫對象。其中經(jīng)常用到的命令有:
? ?1)?dotnet ef migrations add MyFirstMigraton
? ?2)?dotnet ef migrations update database
? ?下面就以WfProcess表的創(chuàng)建來說明大致的創(chuàng)建過程。
2.1 MS SQLSERVER數(shù)據(jù)庫
? ? 采用的數(shù)據(jù)訪問組件默認為: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) 默認值賦值
?3) 生成命令執(zhí)行
dotnet ef migrations add MyFirstMigration
2.2 MySQL數(shù)據(jù)庫
? ? 采用的數(shù)據(jù)訪問組件默認為: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) 默認值賦值?
?3) 生成命令執(zhí)行
dotnet ef migrations add MyFirstMigration
3. Slickflow.WebAPI 快速測試
?3.1 路由模式選定:
? ? 仍然選定傳統(tǒng)路由模式,便于接口快速識別和匹配。
app.UseMvc(route => {route.MapRoute(name:?"defaultApi",template:?"api/{controller}/{action}/{id?}");});3.2 數(shù)據(jù)庫鏈接串讀取:
3.3 測試接口方法
3.4 RestClient 測試工具
? ? ?引擎接口測試采用RestClient工具,比較方便快捷。通常采用統(tǒng)一的接口方法,將不同類型的流程JSON數(shù)據(jù)格式作為測試用例來提交測試。
4. 總結(jié)
? ? ?Slickflow 引擎產(chǎn)品的.NET Core版本實現(xiàn),用于跨平臺應用的項目開發(fā)和業(yè)務集成。而且在數(shù)據(jù)庫的支持上,采用EF Core的Code First數(shù)據(jù)庫遷移創(chuàng)建,方便用戶開發(fā)環(huán)境的快速搭建和配置。
原文地址:http://www.cnblogs.com/slickflow/p/8250317.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的Slickflow.NET 开源工作流引擎基础介绍-.NET Core2.0 版本实现介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Google Optimization
- 下一篇: C# 观察者模式 以及 delegat