C#通过IronPython内嵌Python脚本,实现了对业务逻辑抽象及判断,适合在大量订单需要进行校验的场合使用。

比如,贷款时会对用户进行核查,核查过程可能存在多个节点,并且节点可能会随着政策而不断改变,每个节点就相当于一个脚本,通过脚本的出口关键字来确定流程分支走向。

大概业务流程图如下:

代码实现部分

1、C#代码

using IronPython.Hosting;
using Microsoft.Scripting;
using Microsoft.Scripting.Hosting;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace IronPython调用示例
{
class Program
{
static void Main(string[] args)
{
string logPath = Path.Combine("logs", "log.txt");
if (File.Exists(logPath))
{
File.Delete(logPath);
}
FileStream fileStream = new FileStream(logPath, FileMode.OpenOrCreate);
//Console.WriteLine("------------------------以下是C#执行日志信息------------------------");
try
{
string pythonCodePath = Path.Combine("templates", "pythonCode.txt");
string sourceCodePath = Path.Combine("pys", "performer.py");
if (!File.Exists(pythonCodePath))
{
throw new Exception("Python模板不存在!");
}
if (!File.Exists(sourceCodePath))
{
throw new Exception("Python源代码文件不存在!");
}
string[] pythonCodeContent = File.ReadAllText(pythonCodePath).Split(new string[] { "\r\n" }, StringSplitOptions.None);
string[] sourceCodeContent = File.ReadAllText(sourceCodePath).Split(new string[] { "\r\n" }, StringSplitOptions.None);
if (sourceCodeContent == null || sourceCodeContent.Length == 0)
{
throw new Exception("Python代码不能为空!");
}
List<string> strList = new List<string>(pythonCodeContent);
foreach (var item in sourceCodeContent)
{
strList.Add(" " + item);
}
string codes = "";
foreach (var s in strList)
{
codes += s + Environment.NewLine;
}
ScriptEngine engine = Python.CreateEngine();
ScriptSource source = engine.CreateScriptSourceFromString(codes);
ScriptScope scope = engine.CreateScope();
source.Execute(scope); dynamic performer = scope.GetVariable("performer");
dynamic per = performer("1005");
per.run();
var out_param = per.out_param;
Console.WriteLine(per.out_param);
Console.ReadKey();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message); Console.ReadKey();
}
finally
{
fileStream.Close();
fileStream.Dispose();
}
}
}
}

 2、Python代码,模板(pythonCode.txt)

#.coding=utf-8

import db_manager

class performer():

    def __init__(self,in_param):
self.out_param = ''
self.in_param = in_param def run(self):

 3、节点脚本(performer.py)

import datetime
def get_now_time():
self.out_param = str(datetime.datetime.now())
def get_user_count():
order_id = self.in_param
sql = "select * from user_info where id = "+ order_id +""
querys = db_manager.sqlserver().execute_query(sql)
if(len(querys) >= 5):
self.out_param = '业务办理失败,此用户在全国范围内办理号码已经超过了5个!'
else:
self.out_param = '初审通过,已进入人工审核阶段!' get_now_time()
get_user_count()

  

  注意,此项目需要安装IronPython,并且把里面bin目录复制到我们C# debug目录下,项目源代码:https://github.com/lishuyiba/PythonPerformer

C#内嵌Python架构实现的更多相关文章

  1. Selenium2+python自动化26-js处理内嵌div滚动条

    前言 前面有篇专门用js解决了浏览器滚动条的问题,生活总是多姿多彩,有的滚动条就在页面上,这时候又得仰仗js大哥来解决啦. 一.内嵌滚动条 1.下面这张图就是内嵌div带有滚动条的样子,记住它的长相.

  2. python 内嵌函数, 闭包, 函数装饰器

    一.  函数内嵌 闭包 在python中,函数可以作为返回值, 可以给变量赋值. 在python中, 内置函数必须被显示的调用, 否则不会执行. #!/usr/bin/env python #-*- ...

  3. Python内嵌函数与Lambda表达式

    //2018.10.29 内嵌函数与lambda 表达式 1.如果在内嵌函数中需要改变全局变量的时候需要用到global语句对于变 量进行一定的说明与定义 2.内部的嵌套函数不可以直接在外部进行访问 ...

  4. 零基础入门学习Python(20)--函数:内嵌函数和闭包

    知识点 global关键字 使用global关键字,可以修改全局变量: >>> count = 5 >>> def Myfun(): count = 10 prin ...

  5. python 里内嵌函数是可以修改外部环境里的变量的

    python 里内嵌函数是可以修改外部环境里的变量的 关键是细节. 如果是简单变量类型, 那么不可以. 但是如果是容器类变量, 则没问题了. 代码如下: class G: pass def f(): ...

  6. Windows10内嵌Ubuntu子系统配置python开发环境

    Windows10内嵌Ubuntu子系统配置python开发环境 安装pycharm. 到intellij idea网站下载Linux环境下载免费的pycharm,通过ubuntu子系统内部的/mnt ...

  7. Selenium2+python自动化26-js处理内嵌div滚动条【转载】

    前言 前面有篇专门用js解决了浏览器滚动条的问题,生活总是多姿多彩,有的滚动条就在页面上,这时候又得仰仗js大哥来解决啦. 一.内嵌滚动条 1.下面这张图就是内嵌div带有滚动条的样子,记住它的长相.

  8. (十九)python 3 内嵌函数和闭包

    内嵌函数:函数里又嵌套一个函数 def fun1(): print('fun1()在被调用') def fun2(): print('fun2()在被调用') fun2() 闭包: 闭包是函数里面嵌套 ...

  9. selenium3 + python - js 内嵌滚动处理

    一.js内嵌html <!DOCTYPE html><html lang="en"><head> <meta charset=" ...

随机推荐

  1. oninput 事件 比较angular张的 ng-model指令 和 Vue中的 v-model指令

    oninput 事件在用户输入时触发. 该事件在 <input> 或 <textarea> 元素的值发生改变时触发. 提示: 该事件类似于 onchange 事件.不同之处在于 ...

  2. Rust <3>:控制流

    if.loop.for.while: fn main() { if 3 > 4 { println!{">"}; } else { println!{"< ...

  3. python作业/练习/实战:3、实现商品管理的一个程序

    作业要求 实现一个商品管理的一个程序,运行程序有三个选项,输入1添加商品:输入2删除商品:输入3 查看商品信息1.添加商品: 商品名称:xx 商品如果已经存在,提示商品已存在 商品价格:xx数量只能为 ...

  4. Django框架(十九)—— drf:序列化组件(serializer)

    目录 序列化组件 一.利用for循环来实现序列化(繁琐) 二.利用Django提供的序列化组件(不可控需要的字段) 三.利用drf提供的序列化组件 1.基于Serializer类实现序列化--基本语法 ...

  5. java 重新学习 (一)

    一 垃圾回收特点 1.垃圾回收的工作目标是回收物对象的内存空间,这些内存空间都是jvm堆内存里的空间,垃圾回收器值回收内存资源,对他的物理资源:数据库连接,磁盘I/O等资源则无能为力 2.更快进行垃圾 ...

  6. 马士兵对话京东T6阿里P7(薪水):月薪5万,他为何要离职?

    马士兵大佬你知道吗? 你竟然不知道?你怎么可能不知道!你不知道是不可能的! 记得自己的第一行Java代码,你的Hello World是跟着谁学的吗?我的就是马士兵老师! 马士兵是唯一一个在当时讲课是让 ...

  7. Scrapy框架: 第一个程序

    首先创建项目: scrappy start project maitian 第二步: 明确要抓取的字段items.py import scrapy class MaitianItem(scrapy.I ...

  8. MVC5+EF6 完整教程

    随笔分类 - MVC ASP.NET MVC MVC5+EF6 完整教程17--升级到EFCore2.0 摘要: EF Core 2.0上周已经发布了,我们也升级到core 文章内容基于vs2017, ...

  9. React-native 关于键盘遮挡界面问题

    //引入 KeyboardAvoidingView import { KeyboardAvoidingView } from 'react-native'; //使用 KeyboardAvoiding ...

  10. 解决code first Migration 增加外键时出现错误的问题

    先上模型 Comment public class Comment { [Key] public int CommentId { get; set; } [Required] public int S ...