通用增删改的方法你们怎么写的?

-一个大坑 2021-04-12 05:51:16
目前用的这种,有没有更好的方法
...全文
949 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
通用增删改,也可以查询,只不过写的只能查询返回单个值得结果
一知半解仙 2021-04-14
  • 打赏
  • 举报
回复
用Java、PHP、C、C++、Python等都可以写
wanghui0380 2021-04-14
  • 打赏
  • 举报
回复
昨天在手机上回复,所以很多E文我就随便打了,现在正式回复 在现有的微软Ihost应用框架体系中 你其实要的就是下面这个 app.UseEndpoints(points => { points.map万能update("/万能update"); }); 这就是全部的东西,你想外部给万能api,统一调用。没问题。直接开一个终结点控制去监听处理/万能update的请求中间件,在这个中间件里面你自己实现你的路由识别,action识别 就好。-------------因为坎了退,破坏了原本正常的路由规则,所以这里你就要自己他适配成正常的路由 剩下其实就没有剩下了,因为前插一步因为适配成了正常路由,所以netcore pipeline后续处理按正常路由处理,依旧还是该进那个control进那个control,该调用那个action就调用那个action 如果你非要纠结什么如何调用DAL,ok,原理是一样的, 自己参考微软的mapControls去实现Endpoint注册,识别,调用就好。 最后我贴一下
 app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
                endpoints.MapDelete();
               endpoints.MapPost()

              
            });
看见微软做的事情了么? 那么你非要的万能,统一。可以开始照猫画虎了把 DAL.Use实体(endpoints => { endpoints.映射所有实体 endpoints.映射所有删除; endpoints.映射所有update }); 把所有操作都加入到pipeline里,让你的数据在pipeline自然流动 当然我前面也说,本来我不推荐netcore这个,因为他的目标大,实现庞杂。你现在入手恐怕难得理解 所以我前面给你了一个相对简单干净的pipeline,我们的目的很简单,我们自动把所有处理节点加入pipeline,然后把你要处理的数据丢到这个“数据处理管道里”让他自然流动就好(当然这个pipeline目标简单,并没有像netcore自己那个,中间加入了路由节点控制)
90e家 2021-04-14
  • 打赏
  • 举报
回复
如何是通用的话,泛型是可以的,不过增删改查还是要先封装好通用的类的 这是力软封装的大概代码

  public interface IRepository
    {
        #region  连接信息
        /// <summary>
        /// 获取连接上下文
        /// </summary>
        /// <returns></returns>
        DbConnection getDbConnection();
        #endregion

        #region  事务
        /// <summary>
        /// 开始事务
        /// </summary>
        /// <returns></returns>
        IRepository BeginTrans();
        /// <summary>
        /// 提交
        /// </summary>
        void Commit();
        /// <summary>
        /// 回滚
        /// </summary>
        void Rollback();
        #endregion

        #region  执行 SQL 代码
        /// <summary>
        /// 执行sql语句
        /// </summary>
        /// <param name="strSql">sql语句</param>
        /// <returns></returns>
        int ExecuteBySql(string strSql);
        /// <summary>
        /// 执行sql语句
        /// </summary>
        /// <param name="strSql">sql语句</param>
        /// <param name="dbParameter">参数</param>
        /// <returns></returns>
        int ExecuteBySql(string strSql, object dbParameter);
        /// <summary>
        /// 执行存储过程
        /// </summary>
        /// <param name="procName">存储过程名称</param>
        /// <returns></returns>
        int ExecuteByProc(string procName);
        /// <summary>
        /// 执行存储过程
        /// </summary>
        /// <param name="procName">存储过程名称</param>
        /// <param name="dbParameter">参数</param>
        /// <returns></returns>
        int ExecuteByProc(string procName, object dbParameter);
        /// <summary>
        /// 执行存储过程
        /// </summary>
        /// <param name="procName">存储过程名称</param>
        /// <returns></returns>
        T ExecuteByProc<T>(string procName) where T : class;
        /// <summary>
        /// 执行存储过程
        /// </summary>
        /// <param name="procName">存储过程名称</param>
        /// <param name="dbParameter">参数</param>
        /// <returns></returns>
        T ExecuteByProc<T>(string procName, object dbParameter) where T : class;

        /// <summary>
        /// 执行存储过程
        /// </summary>
        /// <param name="procName">存储过程名称</param>
        /// <returns></returns>
        IEnumerable<T> QueryByProc<T>(string procName) where T : class;
        /// <summary>
        /// 执行存储过程
        /// </summary>
        /// <param name="procName">存储过程名称</param>
        /// <param name="dbParameter">参数</param>
        /// <returns></returns>
        IEnumerable<T> QueryByProc<T>(string procName, object dbParameter) where T : class;
        #endregion

        #region  对象实体 添加、修改、删除
        /// <summary>
        /// 插入实体数据
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="entity">实体数据</param>
        /// <returns></returns>
        int Insert<T>(T entity) where T : class;
        /// <summary>
        /// 批量插入实体数据
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="entities">实体数据列表</param>
        /// <returns></returns>
        int Insert<T>(List<T> entity) where T : class;
        /// <summary>
        /// 删除实体数据
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="entity">实体数据(需要主键赋值)</param>
        /// <returns></returns>
        int Delete<T>(T entity) where T : class;
        /// <summary>
        /// 批量删除实体数据
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="entities">实体数据列表</param>
        /// <returns></returns>
        int Delete<T>(List<T> entity) where T : class;
        /// <summary>
        /// 删除表数据(根据Lambda表达式)
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="condition"></param>
        /// <returns></returns>
        int Delete<T>(Expression<Func<T, bool>> condition) where T : class,new();
        /// <summary>
        /// 更新实体数据
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="entity">实体数据</param>
        /// <returns></returns>
        int Update<T>(T entity) where T : class;
        /// <summary>
        /// 更新实体数据
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="entity">实体数据</param>
        /// <returns></returns>
        int UpdateEx<T>(T entity) where T : class;
        /// <summary>
        /// 批量更新实体数据
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="entities">实体数据列表</param>
        /// <returns></returns>
        int Update<T>(List<T> entity) where T : class;
        #endregion

        #region  对象实体 查询
        /// <summary>
        /// 查找一个实体根据主键
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="KeyValue">主键</param>
        /// <returns></returns>
        T FindEntity<T>(object keyValue) where T : class;
        /// <summary>
        /// 查找一个实体(根据表达式)
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="condition">表达式</param>
        /// <returns></returns>
        T FindEntity<T>(Expression<Func<T, bool>> condition) where T : class,new();
        /// <summary>
        /// 查找一个实体(根据sql)
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="strSql">sql语句</param>
        /// <param name="dbParameter">参数</param>
        /// <returns></returns>
        T FindEntity<T>(string strSql, object dbParameter) where T : class,new();
        /// <summary>
        /// 获取IQueryable表达式
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <returns></returns>
        IQueryable<T> IQueryable<T>() where T : class,new();
        /// <summary>
        /// 获取IQueryable表达式(根据表达式)
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="condition">表达式</param>
        /// <returns></returns>
        IQueryable<T> IQueryable<T>(Expression<Func<T, bool>> condition) where T : class,new();
        /// <summary>
        /// 查询列表(获取表所有数据)
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <returns></returns>
        IEnumerable<T> FindList<T>() where T : class,new();
        /// <summary>
        /// 查询列表根据sql语句
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="strSql">sql语句</param>
        /// <returns></returns>
        IEnumerable<T> FindList<T>(string strSql) where T : class;
        /// <summary>
        /// 查询列表根据sql语句(带参数)
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="strSql">sql语句</param>
        /// <param name="dbParameter">参数</param>
        /// <returns></returns>
        IEnumerable<T> FindList<T>(string strSql, object dbParameter) where T : class;
        /// <summary>
        /// 查询列表(分页)
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="pagination">分页数据</param>
        /// <returns></returns>
        IEnumerable<T> FindList<T>(Pagination pagination) where T : class,new();
        /// <summary>
        /// 查询列表(分页)
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="condition">表达式</param>
        /// <param name="pagination">分页数据</param>
        /// <returns></returns>
        IEnumerable<T> FindList<T>(Expression<Func<T, bool>> condition, Pagination pagination) where T : class,new();
        /// <summary>
        /// 查询数据
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="condition">表达式</param>
        /// <returns></returns>
        IEnumerable<T> FindList<T>(Expression<Func<T, bool>> condition) where T : class,new();
        /// <summary>
        /// 查询列表(分页)
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="strSql">SQL语句</param>
        /// <param name="pagination">分页数据</param>
        /// <returns></returns>
        IEnumerable<T> FindList<T>(string strSql, Pagination pagination) where T : class;
        /// <summary>
        /// 查询列表(分页)
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="strSql">SQL语句</param>
        /// <param name="dbParameter">参数</param>
        /// <param name="pagination">分页数据</param>
        /// <returns></returns>
        IEnumerable<T> FindList<T>(string strSql, object dbParameter, Pagination pagination) where T : class;
        #endregion

        #region  数据源查询
        /// <summary>
        /// 查询数据
        /// </summary>
        /// <param name="strSql">sql语句</param>
        /// <returns></returns>
        DataTable FindTable(string strSql);
        /// <summary>
        /// 查询数据
        /// </summary>
        /// <param name="strSql">sql语句</param>
        /// <param name="dbParameter">参数</param>
        /// <returns></returns>
        DataTable FindTable(string strSql, object dbParameter);
        /// <summary>
        /// 查询列表(分页)
        /// </summary>
        /// <param name="strSql">sql语句</param>
        /// <param name="pagination">分页数据</param>
        /// <returns></returns>
        DataTable FindTable(string strSql, Pagination pagination);
        /// <summary>
        /// 查询列表(分页)
        /// </summary>
        /// <param name="strSql">sql语句</param>
        /// <param name="dbParameter">参数</param>
        /// <param name="pagination">分页数据</param>
        /// <returns></returns>
        DataTable FindTable(string strSql,object dbParameter, Pagination pagination);
        /// <summary>
        /// 获取查询对象
        /// </summary>
        /// <param name="strSql">SQL语句</param>
        /// <returns></returns>
        object FindObject(string strSql);
        /// <summary>
        /// 获取查询对象
        /// </summary>
        /// <param name="strSql">sql语句</param>
        /// <param name="dbParameter">参数</param>
        /// <returns></returns>
        object FindObject(string strSql, object dbParameter);
        #endregion

        #regio
-一个大坑 2021-04-13
  • 打赏
  • 举报
回复
引用 3 楼 正怒月神 的回复:
我好像在上个帖子里说过了。 你要会用泛型

//保存数据的通用比较好写
    public class CRUDDao
    {
        public static ResultMsg UpdateSave<T>(T inputData,bool checkSave) where T : class
        {
            ResultMsg resultMsg = new ResultMsg();
            try
            {
                if (checkSave)
                {
                    int result = FreeSqlHelper.DB.Update<T>(inputData).ExecuteAffrows();
                    if (result != 0)
                    {
                        resultMsg.Status = StatusEnum.Succeed;
                        resultMsg.Message = $"PostEditSave({typeof(T).Name}) Succeed:保存{result}条数据!";
                    }
                }
            }
            catch (Exception ex)
            {
                resultMsg.Status = StatusEnum.Error;
                resultMsg.Message = $"PostEditSave({typeof(T).Name})Error:{ex.Message} ";
            }

    public class CRUDLogic
    {
        public virtual ResultMsg UpdateSave<T>(T inputData) where T : class
        {
            return CRUDDao.UpdateSave<T>(inputData, true);
        }
    }

    public class AATestLogic
    {
        public override ResultMsg UpdateSave<ComboItems>(ComboItems inputData)
        {
            return null;
        }
    }

//接口入处
        [HttpPost("PostUpdateSave")]
        public ResultMsg PostUpdateSave<T>([FromBody] T inputData) where T : class
        {
            CRUDLogic crudLogic = new CRUDLogic();
            return crudLogic.UpdateSave<T>(inputData);
        }
进CRUDLogic还是AATestLogic怎么分辨
-一个大坑 2021-04-13
  • 打赏
  • 举报
回复
引用 1 楼 wanghui0380 的回复:
你的id很熟,你的问题俺们也很熟 我们在来说Ocelot网关为啥还是废双腿,挖眼睛在推拐,推雷达了!因为这块总体是人家运维的活,运维有自己的武功和兵器。人家有得是高功绝艺,自动化编排工具,自动化部署工具,性能监控和分析工具,链路监控工具,日志采集和分析工具,报警工具和预案处置工具。你让人家玩这个,岂不是自费武功么
我只是想少写代码,用个通用的dao和webapi,logic用单独
正怒月神 版主 2021-04-13
  • 打赏
  • 举报
回复
引用 6 楼 mirror030 的回复:
[quote=引用 1 楼 wanghui0380 的回复:]你的id很熟,你的问题俺们也很熟 我们在来说Ocelot网关为啥还是废双腿,挖眼睛在推拐,推雷达了!因为这块总体是人家运维的活,运维有自己的武功和兵器。人家有得是高功绝艺,自动化编排工具,自动化部署工具,性能监控和分析工具,链路监控工具,日志采集和分析工具,报警工具和预案处置工具。你让人家玩这个,岂不是自费武功么
好像又提到博客元,这个圆有啥子问题,近期貌似出了问题在诊改[/quote] 估计有审查部门介入,很多网站都在整改。 只是博客园可能内容比较多。需要的时间也长吧。
mirrorspace 2021-04-13
  • 打赏
  • 举报
回复
引用 1 楼 wanghui0380 的回复:
你的id很熟,你的问题俺们也很熟 我们在来说Ocelot网关为啥还是废双腿,挖眼睛在推拐,推雷达了!因为这块总体是人家运维的活,运维有自己的武功和兵器。人家有得是高功绝艺,自动化编排工具,自动化部署工具,性能监控和分析工具,链路监控工具,日志采集和分析工具,报警工具和预案处置工具。你让人家玩这个,岂不是自费武功么
好像又提到博客元,这个圆有啥子问题,近期貌似出了问题在诊改
圣殿骑士18 2021-04-13
  • 打赏
  • 举报
回复
这是在干嘛,代码好难看。。。
mirrorspace 2021-04-13
  • 打赏
  • 举报
回复
引用 3 楼 正怒月神 的回复:
我好像在上个帖子里说过了。 你要会用泛型
是的,要用泛型 再加反射,可以做到SQL出来的DB数据转化成Entity类. 过程也没什么复杂,就是 建立DB链接 , sql参数,执行sql , 得数据 ,反射设置到实体类.这些过程打个包. 伪代码大概如下 private T[] Select<T>() { try { this.OpenDB(); using (MySqlDataReader dr = this.cmd.ExecuteReader()) { // 得到数据 if (dr.HasRows) { List<T> re = new List<T>(); while (dr.Read()) { // 创建一个实例 T tmp = System.Activator.CreateInstance<T>(); // 循环当行数据行的所有字段 for (int i = 0; i < dr.FieldCount; i++) { // 如果没有找到实体上的属性,则找成员 System.Reflection.FieldInfo field = tmp.GetType().GetField(dr.GetName(i), System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.IgnoreCase); if (field != null) { field.SetValue(tmp, dr[i] == DBNull.Value ? null : Convert.ChangeType(dr[i], field.FieldType)); continue; } } re.Add(tmp); } return re.ToArray(); } else { return null; } } } catch (Exception e) { this.message = e.Message; return null; } finally { this.CloseDB(); } }
正怒月神 版主 2021-04-13
  • 打赏
  • 举报
回复
我好像在上个帖子里说过了。 你要会用泛型
wanghui0380 2021-04-13
  • 打赏
  • 举报
回复
当然如果他是同一站,不用api网关其实也毫无问题。 那就是mvc最后一个app.useenterpoint地方单独对“api/万能update”做处理,写个midware中间件,单独解析路由规则,然后转向到对应control里 当然每个contorl单独写,所谓少写,其实你少写的撒?顶多是少写了几个继承controlbase,但是你牺牲的是可维护,可扩展。为了少写几个control砍掉双腿,值得么
wanghui0380 2021-04-13
  • 打赏
  • 举报
回复
他之所以出现这个问题,就是因为他前面那个问题。 这两个问题是连着的。 他想这样 http://xxxx/api/万能update?type=表2&数据=list表2列表json 所以能前贴说,前置一个api网关就好。他觉着low,一定要自己写个万能update,所以问题就到这里了,怎么根据type去调用dal
正怒月神 版主 2021-04-13
  • 打赏
  • 举报
回复
引用 11 楼 -一个大坑 的回复:
[quote=引用 10 楼 正怒月神 的回复:] 进CRUDLogic还是AATestLogic怎么分辨
你不是在 CRUDLogic crudLogic = new CRUDLogic(); return crudLogic.UpdateSave<T>(inputData); 中已经明确知道是哪个logic了吗[/quote] 我想API一个方法,Dao一个方法,Logic多个(逻辑层,所以需要不同),在api里放CRUDLogic 只是举例,实际情况就和截图一样用n个if判断 if (type == typeof(XXModel)) 我就想能不能不用判断,根据model就自动进入对应的Logic,比如PostUpdateSave传入的是ComboItems 就自动进入AATestLogic [/quote] 感觉没必要啊,就对应的调用logic就好了。 不然以后多加表,在继续if else吗? 这种过度封装,也不灵活。
-一个大坑 2021-04-13
  • 打赏
  • 举报
回复
引用 10 楼 正怒月神 的回复:
进CRUDLogic还是AATestLogic怎么分辨
你不是在 CRUDLogic crudLogic = new CRUDLogic(); return crudLogic.UpdateSave<T>(inputData); 中已经明确知道是哪个logic了吗[/quote] 我想API一个方法,Dao一个方法,Logic多个(逻辑层,所以需要不同),在api里放CRUDLogic 只是举例,实际情况就和截图一样用n个if判断 if (type == typeof(XXModel)) 我就想能不能不用判断,根据model就自动进入对应的Logic,比如PostUpdateSave传入的是ComboItems 就自动进入AATestLogic
正怒月神 版主 2021-04-13
  • 打赏
  • 举报
回复
引用 9 楼 -一个大坑 的回复:
[quote=引用 3 楼 正怒月神 的回复:]我好像在上个帖子里说过了。 你要会用泛型

//保存数据的通用比较好写
    public class CRUDDao
    {
        public static ResultMsg UpdateSave<T>(T inputData,bool checkSave) where T : class
        {
            ResultMsg resultMsg = new ResultMsg();
            try
            {
                if (checkSave)
                {
                    int result = FreeSqlHelper.DB.Update<T>(inputData).ExecuteAffrows();
                    if (result != 0)
                    {
                        resultMsg.Status = StatusEnum.Succeed;
                        resultMsg.Message = $"PostEditSave({typeof(T).Name}) Succeed:保存{result}条数据!";
                    }
                }
            }
            catch (Exception ex)
            {
                resultMsg.Status = StatusEnum.Error;
                resultMsg.Message = $"PostEditSave({typeof(T).Name})Error:{ex.Message} ";
            }

    public class CRUDLogic
    {
        public virtual ResultMsg UpdateSave<T>(T inputData) where T : class
        {
            return CRUDDao.UpdateSave<T>(inputData, true);
        }
    }

    public class AATestLogic
    {
        public override ResultMsg UpdateSave<ComboItems>(ComboItems inputData)
        {
            return null;
        }
    }

//接口入处
        [HttpPost("PostUpdateSave")]
        public ResultMsg PostUpdateSave<T>([FromBody] T inputData) where T : class
        {
            CRUDLogic crudLogic = new CRUDLogic();
            return crudLogic.UpdateSave<T>(inputData);
        }
进CRUDLogic还是AATestLogic怎么分辨[/quote] 你不是在 CRUDLogic crudLogic = new CRUDLogic(); return crudLogic.UpdateSave<T>(inputData); 中已经明确知道是哪个logic了吗
wanghui0380 2021-04-12
  • 打赏
  • 举报
回复
所以你这个东西,根据pipeline可以不可以呢,就你目前的贴出来部分是完全可以用的 微软asp.net core 中间件体系我暂时不想推,因为不够干净,他要完成的东西过多,有些庞杂 所以我们先从一个相对比较干净的基础开局 https://github.com/ipvalverde/PipelineNet var pipeline = new Pipeline<这就是你那方法的参数,我们叫上下文对象>(new ActivatorMiddlewareResolver()) .Add<动作1>() .Add<动作2>() .Add<动作3>(); .add(typeof(动作3)) //注意他还有这个的,我特地拧出来,是因为他支持注册type的,所以这块我们其实也不用这样一个一个的手写,我们可以直接在启动的时候把所有实现了特定动作接口的type用反射查出来,然后用循环加进去,这样无论你后面写多少个都行,这样就能达到上面的说,你只管继承实现,别管什么case的事情 至于动作 在看他的例子 public class PersonWithOddId : IAsyncMiddleware<PersonModel> //这个PersonModel就是你的那个方法参数,我们叫上下文参数 { public async Task Run(PersonModel context, Func<PersonModel, Task> executeNext) { if (context.Id.HasValue && context.Id.Value % 2 != 0) //这里你看到了,他会根据上下文参数去做自己的事情 { context.Level = 2; //这里呢,是如果我这里做了,后面就别做了,那么就直接return,不要做下面就好 } await executeNext(context); //这里呢是交给下个动作去判定自己要不要做 } }
wanghui0380 2021-04-12
  • 打赏
  • 举报
回复
你的id很熟,你的问题俺们也很熟 https://bbs.csdn.net/topics/397089948 说实话,你是一个很勤奋的程序员,值得表扬和夸赞。但是我觉着你应该是时候把博客园带给你的影响完全清除出去了,因为博客园那种是“预练其功,先废双腿,然后用我之拐,保你健拐如飞,快如柯镇恶,帅比段延庆”------------可惜已经是个瘸子了 也许上面这句话很多人不想听,不想看。因为他们不想承认已经瘸了的事实。但是我们说,前面瘸了就瘸了,尽量以后别自废“双腿”了 先来看你的前贴,你前贴想万能,我们说不需要。因为运维自己就能很好处理这件事,你做好你的事情,不需要你去万能。因为如果你废掉双腿,用拐去万能后,博客园的兄弟又告诉你了------废掉双腿,未必成功------------我们用Ocelot网关了,然后一堆人聊天也是言必称Ocelot(当然这个依旧是个废双腿,还带挖眼睛的东西,这个我们后面在说) 在来看你现贴的问题,其实依旧是相同的问题。为啥你要万能,我们不要万能。我们不是神,承认自己不是神,就好。当然承认自己不是神,就是说我们是人,人要有双腿,别砍。你平时怎么做就怎么做,你平时怎么走路就怎么走路,别说我要万能就砍腿用拐。 那么怎么弄,跟你前贴的回答就是一个回答。前贴人家用网关,用路由。你这里一样,名字谁便你起,你叫逻辑网关也好,你叫动作路由也罢都行。也就是别搞万能大法,你就让他们自己保持独立。然后用网关也好,路由也罢,总线topic也行,命名管道也成,pipeline管道也行(整个asp.net core不都在这里么,他的整个pipeline管道怎么找到control的,他各个号称的中间件怎么根据不同的东西处理不同东西的,就不说中间件把,我就说asp.net core让我们跟你这个万能大法一样去写case 1 control1,case2 control2 了么,很明显没有的,他只是告诉你继承controlbase,然后按规则实现) 好了,废话说到这里,你自己理解 我们在来说Ocelot网关为啥还是废双腿,挖眼睛在推拐,推雷达了!因为这块总体是人家运维的活,运维有自己的武功和兵器。人家有得是高功绝艺,自动化编排工具,自动化部署工具,性能监控和分析工具,链路监控工具,日志采集和分析工具,报警工具和预案处置工具。你让人家玩这个,岂不是自费武功么
自由宿主后台管理系统是一套通用后台管理系统,之所以给他加上“宿主”2个字,是因为这套系统本身没有自己的数据库,而必须依赖于其他数据库才能运行,自由指的是系统灵活性强,能够根据数据库表结构做一些简单的配置后系统就能够实现想要的功能。简单的说,就是系统没有根据特定的数据库来设计,你给他套上什么结构的数据库表,他就做什么样的事情。 自由宿主Asp.net网站通用后台管理系统特点如下: 1. 后台本身没有数据库,自己设计数据库后,与后台连接,配置好节点后无需二次开发,直接就可以实现对数据库增删查功能; 2. 后台密码支持自定义加密/解密算法,可以在设置登录表的时候进行配置; 3. 后台编辑界面可以根据配置自动生成编辑器,同时会自动生成验证脚本; 4. 后台支持多表关联,列表查询时候会自动根据关联字段显示相应内容; 5. 兼容IE6+,火狐浏览器等主流浏览器; 6. 对数据库表的操作,如增删查操作只需要进行简单的设置即可完成,无需再进行任何编码实现。 自由宿主Asp.net网站通用后台管理系统3.1正式版更新功能: 1. 修正首次登录页面设置登录表后出现404错误页面的问题; 2. 增加菜单权限控制,可以设置菜单是否有增删功能; 数据库升级方式请参见 http://www.tzhtec.com/art/6f456394186.aspx 自由宿主Asp.net网站通用后台管理系统3.0正式版更新功能: 1. 调整列表和编辑界面样式,列表修为采用easyui的grid显示; 2. 编辑页面日期、编辑器和验证脚本整理,调整到脚本文件edit.js中,如果有其他需求,可以修该脚本文件; 3. 增加oracle和mysql数据库支持,支持,系统可以支持ms sql、access、oracle和mysql等主流数据库; 4. 由于原来的jquery.ui在系统上使用并不多,在本次版后去除了jquery.ui,css和js上有大量瘦身; 5. 登陆后主页显示的default.aspx页面修允许用户自行修设置; 6. 系统对平台要求提升,最低运行环境为framework3.5,不再对framework2.0进行支持; 7. 对SQL查询语句做了优化; 8. 系统架构重新调整;

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧