框架PEANUT-WF接口、扩展、服务

框架PEANUT-WF接口与扩展

1.接口

1.1IDAL

(1). 数据字典

获取接口对象

       var idic=PeanutProvider.Get<ISysDictionaryDal>();

接口说明

        /// <summary>
        /// 查询
        /// </summary>
        /// <param name="assembleName">程序集</param>
        /// <param name="dicName">字典名称</param>
        /// <returns></returns>
        List<SysDictionaryEntity> QueryEntities(string assembleName, string dicName);
        /// <summary>
        /// 查询指定程序集、字典名称,并转换指定自定义实体
        /// </summary>
        /// <typeparam name="T">数据字典实体(属性包含多种类型entity、dic、list)</typeparam>
        /// <param name="assembleName">程序集名称</param>
        /// <param name="dicName">字典名称</param>
        /// <returns></returns>
        T ConvertToCusEntity<T>(string assembleName="", string dicName = "")
            where T : class, new();

通过单例直接获取框架程序集的字典信息

        var dicEntity=Ggo<PeanutDicEntity>.GetObj

DEMO

            var idic=PeanutProvider.Get<ISysDictionaryDal>();
            var entities = idic.QueryEntities("Peanut.BasePC.Wf", "class_info");
            var entities2 = idic.ConvertToCusEntity<PeanutDicEntity>();
            //获取框架已配置的信息,直接单例就可以
            var entities3 = Ggo<PeanutDicEntity>.GetObj;

(2).系统编码

获取接口对象

       var isysEndoce = PeanutProvider.Get<ISysEncodeDal>();

接口说明

        /// <summary>
        ///     获取最新的编码信息
        /// </summary>
        /// <typeparam name="T1"></typeparam>
        /// <param name="columnName">列名</param>
        /// <param name="exprEncodeName">编码字段名</param>
        /// <param name="exprSort">排序字段名</param>
        /// <param name="isDbSame">是否是同一个数据库</param>
        /// <param name="lastRowData">如果不是同一个数据那么最新的编码信息是多少</param>
        /// <returns></returns>
        Tuple<bool, string> GetNewEncodeNo<T1>(string columnName, Expression<Func<T1, object>> exprEncodeName,Expression<Func<T1, object>> exprSort,
        bool isDbSame = true, string lastRowData = "")
            where T1 : class, new();

DEMO

            var lastUserNo = "U-001";
            var isysEndoce = PeanutProvider.Get<ISysEncodeDal>();
            var newNo= isysEndoce.GetNewEncodeNo<SysUserEntity>("用户编号", x => x.UserNo, x =>               x.Id, false, lastUserNo);
            //数据库与编码表所在库相同时候
            var newNo2= isysEndoce.GetNewEncodeNo<SysUserEntity>("用户编号", x => x.UserNo, x =>              x.Id);

(3). 用户管理

获取对象

            var iUserDal = PeanutProvider.Get<IBaseUserDal>();

接口说明

        /// <summary>
        /// 绑定方式查询
        /// </summary>
        /// <param name="userName">用户名</param>
        /// <param name="userNo">用户编号</param>
        /// <param name="classLine">班组</param>
        /// <param name="depart">部门</param>
        /// <returns></returns>
        DataTable QueryUserBind(string userName, string userNo, string classLine, string depart);

        /// <summary>
        ///     保存用户信息(表绑定)
        /// </summary>
        /// <returns></returns>
        bool SaveUserBind();

        /// <summary>
        ///     登陆
        /// </summary>
        /// <param name="name">用户名</param>
        /// <param name="pwd">密码</param>
        /// <returns></returns>
        SysUserEntity CheckLogin(string name, string pwd);

        /// <summary>
        ///     获取登陆信息集合
        /// </summary>
        /// <returns></returns>
        List<SysUserEntity> GetUserList(string userNo = "");

        /// <summary>
        ///     更新编号
        /// </summary>
        /// <param name="result"></param>
        /// <returns></returns>
        bool GetUserNo(ref string result);
        /// <summary>
        /// 根据用户名、用户编号查询实体
        /// </summary>
        /// <param name="userName">用户名</param>
        /// <param name="userNo">用户编号</param>
        /// <returns></returns>
        SysUserEntity QueryUserSingle(string userName, string userNo);

        /// <summary>
        /// 当前用户密码是否存在
        /// </summary>
        /// <param name="userName">用户名</param>
        /// <param name="userNo">用户编号</param>
        /// <returns></returns>
        bool CheckPwd(string userName, string userNo, string pwd);

        /// <summary>
        /// 批量新增用户
        /// </summary>
        /// <param name="list">实体集合</param>
        /// <returns></returns>
        int AddEntities(List<SysUserEntity> list);

1.2窗体

        //单例
        //系统 菜单栏
        PeanutProvider.Get<SysMenuFrm>().ShowDialog();
        //系统文件配置
        PeanutProvider.Get<FileConfigFrm>().ShowDialog();
        //用户管理
        PeanutProvider.Get<SysUserForm>().ShowDialog();
        //数据字典
        PeanutProvider.Get<SysDictionaryFrm>().ShowDialog();
        //框架主页接口
        var imainFrm = PeanutProvider.Get<IFrameMain>();

(1)框架主页接口详情

        /// <summary>
        /// 添加窗体到TabPage
        /// </summary>
        /// <param name="control">Form、UserControl</param>
        /// <param name="text">标题</param>
        /// <param name="isSelect">是否选中</param>
        void AddTabPage(ContainerControl control,string text, bool isSelect = false);
        /// <summary>
        /// 添加窗体到TabPage
        /// </summary>
        /// <param name="entity">菜单栏实体</param>
        /// <param name="isSelect">是否选中</param>
        void LoadTabPage(SysMenuEntity entity, bool isSelect = false);
        /// <summary>
        /// 通过sourceName获取实体
        /// </summary>
        /// <param name="resourceName">资源名称(注入名称或类全名)</param>
        /// <returns></returns>
        SysMenuEntity GetMenuEntity(string resourceName);

2.扩展

2.1文件配置初始化

将自定义用户控件(文件配置)扩展到框架配置模块中;
在这里插入图片描述

(1)创建用户控件并实现接口IFrameFileConfig两个方法

        /// <summary>
        /// 切换到当前TabPage以后点击刷新
        /// </summary>
        /// <param name="tab"></param>
        public void RefreshConfig(object tab)
        {
            
        }
        /// <summary>
        /// 切换到当前TabPage的时候点击保存
        /// </summary>
        /// <param name="tab"></param>
        public void SaveConfig(object tab)
        {
        
        }

(2)在系统初始化完成IOC注册;

container.RegisterType<UcFileConfig>().As<IFrameFileConfig>();

2.2框架主页底部扩展

将自定义用户控件扩展到框架底部(默认为消息通知栏)的右侧DockStyle.Right;
(1)创建用户控件并实现IFrameBottom接口
例如:我们创建用户控件UcBottom,并添加Led控件;
在这里插入图片描述

        /// <summary>
        /// 加载到框架底部以后加载
        /// </summary>
        /// <param name="bottomPl">底部通知栏Panel</param>
        public void LoadBottom(Panel bottomPl)
        {
            
        }

(2)注册控件

container.RegisterType<UcBottom>().As<IFrameBottom>();

(3)在Form_Load中获取

var ucBottom = PeanutProvider<IFrameBottom>.Get<UcBottom>();

效果如下:
在这里插入图片描述

2.3插件扩展

将其他类库以插件的形式扩展到当前框架;
1.使用框架初始化解决方案
(1)引入Peanut.Initialize包(NET6.0/NET462同平台)与项目版本相同;
(2)添加初始化相关,并在IOCIni中完成相关注册;
在这里插入图片描述
在这里插入图片描述
(3)在PeanutConfig.config文件中的ModuleIniNameSpace节点配置模块信息,这里分两种情况,如果引用模块则,此处配置模块的实际程序集信息,如果只是将模块放到程序运行目录下,那么需要填写模块路径信息,如下:

在这里插入图片描述
(4)配置菜单栏
这里配置的程序集为实际的程序集信息;
在这里插入图片描述
(5)重启加载效果如下
在这里插入图片描述

(6)总结:
优点:与框架集成度高,且可以使用框架的初始化解决方案,且Peanut.Initialize包非常轻量级;
缺点:要求与框架是同平台,SDK版本要一致、包的版本一致;
使用场景:通常公司内部模块开发和扩展使用;
2.完全与框架不产生依赖,完全通过反射
(1)直接在PeanutConfig.Config配置ModuleIniNameSpace,具体同上
(2)配置菜单栏
在这里插入图片描述

(3)加载效果如下:
在这里插入图片描述

(4)总结:
优点:不要求加载模块与框架是同平台例如NET6.0可以加载NET462,没有框架引用没有其他约束,
缺点:由于只是加载模块的某个功能,可能很多初始化的未完成加载造成异常,由于跟框架依赖减少,可能相关功能通用性降低;
使用场景:由于项目需要单纯加载一个组件,且没法要求同平台的情况;
3.进程启动加载
以上两种情况或多或少的对平台、开发语言等有要求,当然扩展效果都是比较好的,且一定要了解模块的内部信息,如程序集、类名等资源,使用进程启动不需要这些限制,当然同时也是加载效果最不好,同时失败情况比较多,需要进行测试后才能确定,这里我们加载一个小工具测试一下;
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
4.WebBrowser
使用内嵌的Chrome浏览器组件,只需要将“加载模式”选择WebBrowser,设定“资源地址”为网站地址即可;
WebView2运行环境下载

在这里插入图片描述

总结:只面向Web集成

2.4用户自定义权限扩展

1.创建自定义权限模板

    [UserAuthorityTemplate]
    public class ProjectAuthorityEntity: IUserAuthorityTemplate
    {
        /// <summary>
        /// 新增权限
        /// </summary>
        [TreeNode(1000, -1, "权限根节点")]
        public AuthorityConfig RightsManagerParent { get; set; } = new AuthorityConfig();
        [TreeNode(1001, 1000, "权限子节点1")]
        public AuthorityConfig RightsManagerChild1 { get; set; } = new AuthorityConfig();
        [TreeNode(1002, 1000, "权限子节点2")]
        public AuthorityConfig RightsManagerChild2 { get; set; } = new AuthorityConfig();

        /// <summary>
        /// 新增权限
        /// </summary>
        [TreeNode(1010, -1, "权限根节点")]
        public AuthorityConfig RightsManagerParent2 { get; set; } = new AuthorityConfig();
        [TreeNode(1011, 1010, "权限子节点1")]
        public AuthorityConfig RightsManagerChild12 { get; set; } = new AuthorityConfig();
        [TreeNode(1012, 1010, "权限子节点2")]
        public AuthorityConfig RightsManagerChild22 { get; set; } = new AuthorityConfig();
    }

2.IOC注册模板

container.RegisterType<ProjectAuthorityEntity>().As<IUserAuthorityTemplate>();

3.加载权限模板
在菜单管理-用户管理-权限模板中,点击“加载模板”(如果框架权限也需要初始化可以勾选“包含框架”)则会将现有实体定义模板加载;
在这里插入图片描述
在这里插入图片描述
4.获取当前权限

var valid= Ggo.GetObj<ProjectAuthorityEntity>().RightsManagerChild12.Valid;

2.5权限验证IdentifyConfirmFrm

var identifyConfirmFrm = new IdentifyConfirmFrm(this, () =>
            {
                //验证通过以后
                this.BeginInvoke(new Action(() => { c1DockingTab1.Enabled = true; }));
                toolStrip1.Enabled = true;
            }, () =>
            {
                //初始化未验证
                this.BeginInvoke(new Action(() => { c1DockingTab1.Enabled = false; }));
                toolStrip1.Enabled = false;
            }, "8421");

3.服务

3.1WebApi

1.IOCIni中注册

container.RegisterSystemIni<PeanutServer, IServiceIni>();

2.初始化启动

        public void ServiceLoad()
        {
            //登录成功以后启动WebApi服务器
            ServiceStart.WebApiStart<StartupEx>();
        }

3.创建Controller,通常在项目Api下
在这里插入图片描述

坚持学习WF(1):从HelloWorld开始 本文主要通过实现了一个可以接受参数的HelloWorld程序来了解WF。 坚持学习WF(2):WF创作模式和设计时工具 坚持学习WF(3):WF框架概览 2.3两篇主要全面的阐述了WF框架和Visual Studio对开发WF的一些设计时的工具。 坚持学习WF(4):活动(Activity)和依赖属性(DependencyProperty) 坚持学习WF(5):自定义活动(CustomActivity) 4.5两篇对主要对活动(Actibity)的介绍和依赖属性(DependencyObject)和DependencyProperty事件的使用。 坚持学习WF(6):开发可复用的宿主程序 主要实现两个类来对WorkflowInstance和WorkflowRuntime进行简单的封装。 坚持学习WF(7):流程控制(Flow Control) 主要说了WF中和流程相关的活动,主要包括以下这些活动:IfElseActivity,WhileActivity,ParallelActivity,ReplicatorActivity,ConditionedActivityGroup,InvokeWorkflowActivity,TerminateActivity,SuspendActivity等。 坚持学习WF(8):本地服务之调用外部方法 坚持学习WF(9):本地服务之事件处理 工作流能够使用方法和事件通过消息与宿主程序交互。 事件用于将数据发送到工作流,而工作流使用方法将数据发送到主机应用程序,8.9两篇主要说了本地服务如何调用外部方法和接收事件。 坚持学习WF(10):在工作流中使用关联 当工作流实例在本地服务接口上侦听相同事件的不同实例时,就无法确定该响应哪个事件。如何解决这个问题呢,我们就需要在工作流中使用关联。 坚持学习WF(11):工作流通信与队列 WF 提供的通信模型是构建于队列系统的基础之上,我们可以使用自定义活动来注册以接收关于队列的消息,而宿主应用程序中的服务则发送关于队列的消息。自定义活动可以使用此模型来处理外部事件,也可以传递异步活动执行的完成。这样,您的活动可以先执行到某一点,然后等待激发因素的到来以便继续执行。 坚持学习WF(12):使用EventHandlingScopeActivity活动 EventHandlingScopeActivity活动包含一个主线子活动和一组事件处理活动(EventHandlersActivity),它的主线子活动中只能包含一个子活动。它会执行其主子活动比如SequenceActivity。 同时,可能会执行每个EventDrivenActivity,也可能不执行它们,这取决于在SequenceActivity 活动执行时是否发生了它们的事件,当主线活动执行完了整个EventHandlingScopeActivity活动也就结束了。 坚持学习WF(13):WF中的持久化服务 主要介绍了如何使用WF中提供的SqlWorkflowPersistenceService来进行持久化存储。 坚持学习WF(14):自定义持久化服务 我们除了使用WF提供的SqlWorkflowPersistenceService外,还可以自定义持久化服务。因为有的时候你可能不想使用Sql Server数据库,我们就可以通过自定义持久化服务来使用其他的数据库,文件等来进行持久化存储。 坚持学习WF(15):状态机工作流 本文主要介绍WF中状态机工作流的基础知识,状态机工作流和顺序型工作流不同。顺序型工作流一般是比较固定的,可预测的,和系统交互的时候比较多。而状态机工作流一般是不可预测,和人的交互会比较多一些,一般有回退流程的时候使用状态机工作流会比较好一点,如何正确的选择顺序型工作流还是状态机工作流是十分重要的。 坚持学习WF(16):WF中的事务 在关系型数据库中支持事务已经有10几年了,事务用来解决数据的完整性、一致性等等问题。在WF中提供了TransactionScopeActivity活动用来支持事务,当该活动执行时一个System.Transactions.Transaction实例就被创建了,如果TransactionScopeActivity中的子活动有一个有异常,就会执行回滚操作。 坚持学习WF(17):WF中的补偿 事务是你在做一组更新时要不成功,要不失败,不可能只部分更新。事务最经典的使用场合就是在关系型数据库中。补偿是取消之前已经成功的操作,在我们的工作流中我们可能完成一项任务有很多活动组成,比如我们的活动都使用了TransactionScopeActivity,我们在之后发现错误了,想要取消之前成功的操作,这个和事务就没有关系了,因为事务已经成功了。这个时候我们就可以使用补偿。 坚持学习WF(18):使用IPendingWork接口 WF会定期在各个持久性点(Persistence Point)检查并将工作流实例保存到持久化存储中,这样如果工作流出现错误或是异常终止时相关的信息就会被存储,下次加载工作流实例时就会从此做为开始点。这个主要是针对工作内置的服务。工作流的外部服务使用工作批次来保留状态信息。 这些服务对其工作项进行批处理并共享与工作流的事务相同的事务。 如果工作流尚未提交事务,则服务仍可以在持久点期间对某些工作项进行批处理。WF提供 IWorkBatch 和 IPendingWork 以帮助服务和工作流实例保留状态信息。 坚持学习WF(19):工作流线程 WF中提供了很多内置的服务,其中工作流计划服务是用来管理工作流实例线程的。默认情况下WF会自动使用DefaultWorkflowSchedulerService服务,我们还可以手动去加载ManualWorkflowSchedulerService服务。本文利用MSDN中的一个例子来说明工作流中的线程以及如何使用DefaultWorkflowSchedulerService和ManualWorkflowSchedulerService服务。 坚持学习WF(20):规则引擎中的活动条件 坚持学习WF(21):规则引擎中的RuleSet 坚持学习WF(22):跟踪规则 坚持学习WF(23):以代码的方式构造和执行RuleSet WF提供了非常灵活,强大和简单易懂的规则引擎。这几篇文章介绍了WF中规则引擎的相关知识。 坚持学习WF(24):WF中的异常处理 坚持学习WF(25):取消容器(CancellationHandlerActivity) 说明了WF如果捕获和处理异常,并介绍了CancellationHandlerActivity活动的基本使用。
如果你在使用Spring Boot时遇到了"spring-boot-starter-web"报红的问题,可能是因为相关的依赖库没有正确引入或版本不匹配。一种解决方法是检查你的项目的pom.xml文件,确保正确引入了"spring-boot-starter-web"依赖。你可以在pom.xml文件的dependencies部分中添加以下代码来引入该依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>3.0.2</version> </dependency> ``` 请注意,这里的版本号是示例,你可以根据你的项目需要选择合适的版本号。同时,你可能还需要引入其他相关的依赖,比如"spring-boot-starter-test"和"spring-boot-maven-plugin",以满足项目的需求。确保这些依赖也在pom.xml文件中正确引入了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [“spring-boot-starter-web“等报红问题](https://blog.csdn.net/Peanut31434331/article/details/128988246)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [spring-boot-starter-websocket爆红](https://blog.csdn.net/peterlong0612/article/details/128952982)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值