• 让我们的领域逻辑彻底裸奔吧


      菜阿斌以前写了两篇很好的文章:为什么要让我们的“领域模型”裸奔?(上)(下),在我的 架构视角面面观中也介绍了领域逻辑经常被Web 组件Api、分布组件Api、ORM组件API、ADO API 等污染,上面的几篇文章讲了领域裸奔的重要性、以及常见项目中的领域被污染的问题,关于如何解决该问题, 网上关于这方面的介绍倒很少。本篇将介绍如何让我们的领域逻辑不被Web组件、分布组件所污染,解决该问题的主角将是NLite.WebAPI 组件,下面就让它登场吧。

      NLite WebApi

      NLite web api 是基于NLite.WebNdf的服务分发器引擎,并借助Asp.net 的http原生态无状态协议的基础上搭建起来的 ,NLite Web api 完全无侵入性,不继承任何基类,只需要简单的配置即可把业务逻辑自动分发成NLite Web Api 服务。

        

        准备工作

    1.  新建一个空的ASP.NET Web Application项目

        

       2. 通过Nuget 下载NLite.Web 组件:install-package nui (NUI 是NLite.Web 组件在Nuget库中的标志Id)

        3. 添加裸奔的领域逻辑:CalculateService(这里仅仅为了演示,没有把领域逻辑放到单独的项目中)

        public class CalculateService
        {
            public int Add(int a, int b)
            {
                return a + b;
            }
            public int Sub(int a, int b)
            {
                return a - b;
            }
            public int Multiply(int a, int b)
            {
                return a * b;
            }
            public int Divide(int a, int b)
            {
                return a / b;
            }
        }

      配置NLite WebApi

      1. 添加Global文件(下面步骤的配置代码如果没有特殊说明的话都在Application_Start方法中放着),并导入下面的namespace

    using NLite;
    using NLite.Cfg;
    using NLite.Domain.Cfg;
    using NLite.Web;

      2. 创建NLite 配置对象

      var cfg = new NLite.Cfg.Configuration();

           3. 配置NLite的DI 容器-Mini容器

     //配置DI容器
     cfg.Configure();

      4. 配置WebApi的Url 路由映射模版:api/{controller}/{action}/{id},那么CalculateService的Add方法对应的Url为:api/calculate/add

                //配置WebAPI 路由服务
                cfg.MapRequestRoute(new ServiceRouteOption
                {
                    Name = "WebApi",
                    Url = "api/{controller}/{action}/{id}",
                    Defaults = new { id = NLite.Web.UrlParameter.Optional }
                });

      5. 异常处理配置

                //异常配置
                cfg.Add(new ExceptionConfigurationItem(container =>
                {
                    container
                        .Register<NLite.Domain.ExceptionCode>()//注册异常编码规则
                        .Register<NLite.Web.Service.HttpJsonExceptionRender>()//注册Json格式的异常呈现器
                        .Register<LogExceptionReander>()//注册日志格式的异常呈现器
                        .Register<ServiceDispatcherExceptionResolver>()//注册服务分发异常解析器
                        .Register<DomainExceptionResolver>()//注册领域(业务)异常解析器
                        .Register<DbExceptionResolver>()//注册Db异常解析器
                        .Register<UnknowExceptionResolver>()//注册未知异常解析器
                        .Register<ExceptionHandler>();//注册异常处理器
                }));

      6. 配置领域逻辑组件(比如Demo的CalculateService

               //配置领域服务
                cfg.Add(new DomainComponentConfigurationItem(container =>
                {
                    LifestyleType.Default = LifestyleFlags.Transient;
                    container.Register<CalculateService>();
                }));

      F5 运行NLite WebApi 

      1. 在浏览器中输入:http://localhost:9620/api/calculate/add?a=2&b=3,那么NLite WeApi的调用流程:NLite.WebApi->NDF->CalculateService.Add(2,3)

        

      备注:   code 是服务器返回的状态码,code=1是成功,反之失败,data 的内容就是服务返回的真正结果

      2. 在浏览器中输入:http://localhost:9620/api/calculate/multiply?a=2&b=3,那么NLite WeApi的调用流程:NLite.WebApi->NDF->CalculateService.Multiply(2,3)

      总结

    通过上面的例子看出,我们的领域逻辑组件CalculateService,非常干净,没有被任何Asp.net Web组件污染,也没有被任何分布框架的Api污染,仅仅需要简单的领域组件注册即可自动的发布成WebApi组件。

    本篇的NLite WebApi 的配置和Demo例子都是手写的,其实这篇文章 :给Web Api 再加把柴-让它更火起来 给大家一个更简单的方式来使用WebApi。为了更进一步了解WebApi 底层的Ndf服务分发器可以看看这篇文章:松耦合服务调用利器-服务分发器

  • 相关阅读:
    [Go] 解决空接口 interface{} cannot use (type []string) as type []interface {}
    [Linux] 脚本中的set -e有什么作用
    [Go] 解决go test 时 testing: warning: no tests to run
    [Go] go for range循环map是无序的 变成有序
    [Linux] ubuntu 32位 i686 安装docker
    [Git] git checkout 恢复未add的修改文件
    [MySQL] in 子查询出现DEPENDENT SUBQUERY问题
    [MySQL] group by 聚合函数的原理和聚合限制原因SELECT list is not in GROUP BY clause and contains nonaggregated column
    [MySQL]mysql的ANY_VALUE()函数 解决 ONLY_FULL_GROUP_BY 模式
    [Go] GODEBUG=inittrace=1 查看所有执行的init函数
  • 原文地址:https://www.cnblogs.com/netcasewqs/p/2919819.html
Copyright © 2020-2023  润新知