惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
J
Java Code Geeks
小众软件
小众软件
D
Docker
腾讯CDC
H
Hackread – Cybersecurity News, Data Breaches, AI and More
V
V2EX
博客园 - 叶小钗
GbyAI
GbyAI
Microsoft Azure Blog
Microsoft Azure Blog
Stack Overflow Blog
Stack Overflow Blog
B
Blog RSS Feed
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 【当耐特】
IT之家
IT之家
博客园 - 司徒正美
M
MIT News - Artificial intelligence
T
The Blog of Author Tim Ferriss
The GitHub Blog
The GitHub Blog
罗磊的独立博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
L
LangChain Blog
阮一峰的网络日志
阮一峰的网络日志
C
Check Point Blog

博客园 - 风云

Vane.Dispatch 1.0.0 发布:一个与容器、传输层零耦合的 .NET 服务分发引擎 MiniLog 1.0 GA 发布:零分配、零依赖的 .NET 高性能日志框架 从实战到生产:Acl.Excel 八大场景与避坑指南(终篇) 写入分配砍掉 63%:Acl.Excel 绕过 XmlWriter 字节直写 零依赖纯 C# DEFLATE 引擎:2916 行移植 libdeflate 一个 42KB 的 Excel 如何撑爆 4.5PB?Acl.Excel 8 层防御 Acl.Excel 跨库基准:读取最高快 32.8 倍 24B消灭上亿次装箱:Acl.Excel零装箱设计 百万行Excel如何恒定内存?Acl.Excel流式拆解 不依赖 NPOI/ClosedXML,纯 C# Excel 库如何做到 30 倍性能? 2-30 倍性能:Acl.Excel 设计哲学与零依赖 Acl.Excel vs MiniExcel 1.45.0:百万行读写实测,托管内存低至 1/37,QueryFirst 平分秋色 优化纯 C# DEFLATE 压缩器:从 0 到超越 .NET 内置的完整历程 从零实现 DEFLATE 压缩器:纯 C# 移植版如何在 Excel 场景超越 .NET 内置? Docker下构建centos7容器无法使用systemctl命令的解决办法 重新诠释的OSGi规范 NLite.Web 组件更新日志 Ndf 组件更新日志 新年首作-ELinq+T4模版引擎制作多文件实体代码生成器 ORM组件 ELinq (五)-映射配置之XML ORM组件 ELinq (四)-映射配置之FluentAPI ORM组件 ELinq (三)-映射配置之Attribute NLite 更新日志 ORM组件 ELinq 更新日志 ORM组件 ELinq (二) 映射配置之Table 用户中心 - 博客园 ORM组件 ELinq 系列 国内开源ORM组件 ELinq正式版发布 ORM组件 ELinq (一)首航之旅 年度开源力作-ORM组件 ELinq诞生了
让我们的领域逻辑彻底裸奔吧
风云 · 2013-02-21 · via 博客园 - 风云

  菜阿斌以前写了两篇很好的文章:为什么要让我们的“领域模型”裸奔?(上)(下),在我的 架构视角面面观中也介绍了领域逻辑经常被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服务分发器可以看看这篇文章:松耦合服务调用利器-服务分发器