项目目标部署环境:CentOS 7+

项目技术点:.netcore2.0 + Autofac +webAPI + NHibernate5.1 + mysql5.6 + nginx

开源地址:https://github.com/wmowm/nh.core

作为.net开发人员,我们最熟悉的肯定是经典的三层架构了

这里插入一个题外话,很多人喜欢拿三层跟mvc,mvvm 做一些比较,它们共通的只有一点,就是解耦,三层架构指的是项目结构,一个项目可以搭建三层,加个IDAL 那就是四层了,也可以是N层,MVC只是 UI层里的一个设计模式,mvvm只是前端的一种设计模式,例如vue

我们这里就基于经典的三层,进行拓展,并说明彼此之间关系

先说DAL数据访问层,很多小伙伴喜欢用ADO.net来操作数据库,简单方便,手写sql简洁又高效,这方面进行封装的栗子也很多,先创建一个DAL层,然后Nuget找.net core里操作SQL SERVER的驱动,测试链接,再测试CRUD,测试通过,完美!

刚高兴了一秒,反过来想想,好像有点不对劲,我们部署的目标环境是Linux,Linux上面好像没听说谁用SQL SERVER,用MySQL的最多,难道再去找MySQL的驱动......如果项目需求变了,随便往表里删除几个字段,加几个字段,那估计要崩溃

如何兼容多种数据库?

ORM粉末登场,呸,闪亮登场................................

这里我选用NHibernate5.1,它支持.net core2.0,这里对ORM不做多的介绍,想学习这个ORM的可以去园子里找找资料,挺多的,这里推荐丹妮大叔的博客

不能因为我会NHibernate就选用这款ORM,还有很多优秀的ORM 例如Dapper,国产SqlSugar,微软亲儿子EF ........我们要做到求同存异

这里我再加一层,IDAL 抽象出CRUD操作,由DAL去实现它,我不用管它是具体是哪款ORM,能实现CRUD即可

IDAL与DAL都属于数据仓储,对数据的一些操作,这里我给它们换个名字

数据访问层做好,我们就开始做数据模型,没有模型我们也无法实现CRUD,因为我这边是NHibernate,里面会多一个mapp文件,结构如下

接下来我们继续搭建业务层,很多人会忽略这一层,把一些业务逻辑写到控制器,或者DAL里面,这种是不可取的,前面我们已经抽象出了CRUD,无法满足复杂业务的需要,此时就需要在业务层做一些处理

我把它分为两个部分,Method是CRUD,自定义是一些复杂的业务逻辑

做到这里,是不是业务层就完成了呢?

我们是搭建.net core项目,在.net core无处不在的依赖注入,我们怎么通过依赖注入实现UI 与 BLL的解耦?

依赖倒置:高层模块不应该依赖底层模块,他们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。

我们可以抽象一个IBLL,嗯,很对,先抽象出来,后续文章会在讲解Autofac里详细说明,名字也改个高达上的

做完了业务逻辑,我们就开始做UI层

先创建一个mvc项目,考虑到可能要支持多终端,再创建一个webapi,对外提供统一的服务接口

做到这里,框架基本搭建的差不多了,那么问题来了,那么那个模块该添加Autofac的引用呢?

想做到解耦,第一点就是功能职责单一,所以我新增了一个配置中心,它由两块组成,结构如下

Tibos.Config 引用Autofac,实现AOP与模块注入,在DefaultModule里我们将业务层注入到Autofac 的IOC容器里面,所有关于Autofac的注入操作,都在这个程序集内实现

Tibos.ConfingModel 用于全局的配置文件读取,.net core里的配置文件格式为json,我们先将json序列化成model对象,然后注册.net core的中间件,这里的配置文件都是自定义的一些配置文件,根据格式放在指定的文件夹

最后还差个常用类库,与测试了,这里就不做过多介绍

到这里,整个项目结构介绍完毕,欢迎各位大佬拍砖,觉得有点用的可以去github给我点星,后续介绍里面的一些实现案例

最终结构图

开源地址:https://github.com/wmowm/nh.core

转载请标明原文出处:http://www.cnblogs.com/tibos/p/8881337.html

第一章 搭建一个通用的.net core项目框架的更多相关文章

  1. 一起来学Spring Cloud | 第一章 :如何搭建一个多模块的springcloud项目

    在spring cloud系列章节中,本来已经写了几个章节了,但是自己看起来有些东西写得比较杂,所以重构了一下springcloud的章节内容,新写了本章节,先教大家在工作中如何搭建一个多模块的spr ...

  2. 第一章 搭建Qt开发环境

    第一章 搭建Qt开发环境 1.到http://download.qt-project.org/archive/上下载Qt的源码包.我下载的是qt-everywhere-opensource-src-4 ...

  3. 第一章 第一个spring boot程序(转载)

    第一章 第一个spring boot程序 本编博客转发自:http://www.cnblogs.com/java-zhao/p/5324185.html   环境: jdk:1.8.0_73 mave ...

  4. C#语言————第一章 第一个C#程序

    第一章    第一个C#程序 ******************C#程序***************     ①:建立项目:文件-->新建-->项目-->c#-->控制台程 ...

  5. 搭建一个舒适的 .NET Core 开发环境

    最近,一直在往.Net Core上迁移,随着工作的深入,发现.Net Core比.Net Framework好玩多了.不过目前还在windows下开发,虽然VisualStudio是宇宙第一神器,但是 ...

  6. 第一章 第一个spring boot程序

    环境: jdk:1.8.0_73 maven:3.3.9 spring-boot:1.2.5.RELEASE(在pom.xml中指定了) 注意:关于spring-boot的支持, 最少使用jdk7(j ...

  7. 如何搭建一个基于nuxt.js的项目

    介绍 nuxt.js(中文官方文档)是vue.js的一个通用型应用框架,有了之前搭建vue项目的过程之后,搭建一个nuxt项目就会十分简单. 搭建步骤 1.打开命令提示符,进入到相关文件夹下: 2.使 ...

  8. iOS通用的MVC模式项目框架MobileProject

    最近项目比较不赶的情况下,决定把一些通用.常用的内容集成在一个项目框架中,意在新项目中可以快速搭建:其实经过几个项目后,总是有一些重复的创建工作,可以使用本项目的内容直接进行开发:采用的是MVC的分层 ...

  9. 2017.12.12 架构探险-第一章-从一个简单的web应用开始

    参考来自:<架构探险>黄勇 著 1 使用IDEA搭建MAVEN项目 1.1 搭建java项目 (1)创建java项目 为了整个书籍的项目,我创建了一个工程,在这个工程里创建了每个章节的mo ...

随机推荐

  1. 将 Shiro 作为应用的权限基础 三:基于注解实现的授权认证过程

    授权即访问控制,它将判断用户在应用程序中对资源是否拥有相应的访问权限. 如,判断一个用户有查看页面的权限,编辑数据的权限,拥有某一按钮的权限等等. 一.用户权限模型 为实现一个较为灵活的用户权限数据模 ...

  2. [poj2923]Relocation_状压dp_01背包

    Relocation poj-2923 题目大意:给出n个物品,有两辆车,两辆车必须一起出动并且每辆车有单独的容量.问最少需要运输多少次才能运走所有货物. 注释:n<=10,容量,物品代价< ...

  3. Linux中SVN的备份与恢复

    linux中SVN备份有三种方式 1.svnadmin dump 是官方推荐的备份方式,优点是比较灵活,可以全量备份也可以增量备份,并提供版本恢复机制. 缺点是版本数过大,增长到数万以上,那么dump ...

  4. java枚举类型变通

    原始用法 public enum Color { RED, GREEN, BLANK, YELLOW } 开发中用法 public enum ApiCodeEnum { SUCCESS(0," ...

  5. Jmeter-基于Ubuntu运行

    这几天折腾了很久,整合了一套接口自动化的持续集成工具,先从最基础的运行Jmeter说起.由于我是用Docker部署的持续集成环境,所以接口运行必须在服务器上 一:在Linux服务器先安装jdk 1:先 ...

  6. LeetCode-4. 两个排序数组的中位数(详解)

    链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/description/ 有两个大小为 m 和 n 的排序数组 nums ...

  7. Alpha第十天

    Alpha第十天 听说 031502543 周龙荣(队长) 031502615 李家鹏 031502632 伍晨薇 031502637 张柽 031502639 郑秦 1.前言 任务分配是VV.ZQ. ...

  8. 201621123040《Java程序设计》第12周学习总结

    1.本周学习总结 2.面向系统综合设计-图书馆管理系统或购物车 2.1简述如何使用流与文件改造你的系统.文件中数据的格式如何? 将书目信息写入文件,查阅图书馆书目信息时,实现文件的读取 2.2简述系统 ...

  9. C++类型萃取

    stl中的迭代器和C++中的类型萃取: http://www.itnose.net/detail/6487058.html 赐教!

  10. fread函数详解

    函数原型: size_t   fread(   void   *buffer,   size_t   size,   size_t   count,   FILE   *stream   )    b ...