zoukankan      html  css  js  c++  java
  • 【asp.net core 系列】6 实战之 一个项目的完整结构

    0. 前言

    在《asp.net core 系列》之前的几篇文章中,我们简单了解了路由、控制器以及视图的关系以及静态资源的引入,让我们对于asp.net core mvc项目有了基本的认识。不过,这些并不是 asp.net core mvc项目的全部内容,剩下的内容我将结合实战项目为大家讲解其中的知识。现在,就让我们开始吧。

    1. 项目构建

    抛开之前的项目,现在跟着我重新创建一个项目,第一步依旧是先创建一个解决方案:

    dotnet new sln --name Template
    

    我先介绍一下这个项目(指整个项目,不是单独的asp.net core 应用),这是一个后台管理的模板应用,提供了常见后台系统(管理员端)的功能,包括员工管理、部门管理、角色管理等功能。

    现在回到项目中,通常一个项目需要一个模型层,一个数据提供层以及web展示层。然后,我们依次创建 Data、Domain、Web 三个项目,其中Data和Domain 是 classlib,Web是mvc项目。

    # 确保当前目录与 Template.sln 处于相同的目录
    dotnet new classlib --name Data
    dotnet new classlib --name Domain
    dotnet new mvc --name Web
    

    添加三个项目到解决方案中:

    dotnet sln add Data
    dotnet sln add Domain
    dotnet sln add Web
    

    因为Data 中存放着模型层,所以需要其他项目对它有一个引用:

    cd Domain
    dotnet add reference ../Data
    cd ../Web
    dotnet add reference ../Data
    

    当然,实际开发中我们应当还有一个Service层,这一层用来存放业务代码,减少控制器里不必要的业务代码。那么继续:

    # 回到项目的根目录
    cd ..
    dotnet new classlib --name Service
    dotnet sln add Service
    

    然后添加Service的引用:

    cd Service
    dotnet add reference ../Data
    

    将 Service的引用添加到Web里:

    cd ../Web
    dotnet add reference ../Service
    

    现在一个大型工程基本都是面向接口编程,几个关键层应当都是接口层,我们实际上还缺少Domain的实现层和Service的实现层。

    cd ..
    dotnet new classlib --name Domain.Implements
    dotnet new classlib --name Service.Implements
    

    在对应的实现层中,引入它们实现的接口层,并引入Data:

    cd Domain.Implements
    dotnet add reference ../Data
    dotnet add reference ../Domain
    cd ../Service.Implements
    dotnet add reference ../Data
    dotnet add reference ../Domain
    dotnet add reference ../Service
    

    这里在Service的实现层添加Domain接口层的引用,而不是实现层的引用。这是因为面向接口编程,我们需要对Service实现层隐藏Domain的实现,所以对于Service的实现层来说,不需要关心Domain层的实现逻辑。

    在Web中添加新建的两个实现层的引用:

    cd ../Web
    dotnet add reference ../Domain.Implements
    dotnet add reference ../Service.Implements
    

    添加这两个实现层到解决方案中:

    cd ..
    dotnet sln add Domain.Implements
    dotnet sln add Service.Implements
    

    下图是到目前为止的项目结构图:

    整体而言,Data是各个层之间的数据流通依据,所以各个项目都依赖于此项目,各个接口层的实现层都只对Web可见,其他各层实际上并不清楚具体实现。

    隐藏实现层有什么好处呢?

    • 调用方不知道实现方的逻辑,避免调用方对特定实现的依赖
    • 有利于团队协作,有的团队是针对模块划分,有的是针对分层划分,无论哪种,使用接口都是一个好的选择
    • 有利于后期优化,可以很方便的切换实现层,而不用重新编译过多的代码

    当然,并不只有这些好处,不过这样有一个坏处,在web层调用service层时会更繁琐,不过这也不是不可解决的,后续的内容中会为大家介绍如何解决这个烦恼。

    2. 项目补充

    通常情况下,一个完整的项目还会有一个工具类项目和一个测试项目。所以,继续添加以下项目:

    dotnet new classlib --name Utils
    

    Utils 表示工具类,通常一个项目中工具类会比较多,所以就抽成了一个项目,单独列出来。

    添加测试项目:

    dotnet new nunit --name Test
    

    这里使用的是nunit 3测试框架,当然还有另一个是xunit测试框架。

    添加两个项目到解决方案里:

    dotnet sln add Utils
    dotnet sln add Test
    

    3. 总结

    本章内容旨在通过创建项目,让大家了解实际开发中项目的层级规划思想,这并不代表我的就是最优的,只是这是我总结出来相对方便的层级关系。这里并没有讲解如何通过Visual Studio或者Rider创建这样的一个项目,我希望大伙能够自己试试。

    好了,希望大家能创建好项目,当然了后期我会给大家提供这个项目的源码的,地址暂时保密哦。

    更多内容烦请关注我的博客《高先生小屋》

    file

  • 相关阅读:
    Sql Server 2008 为开发带来的新特性
    MSMQ 与ESB
    面向服务架构(SOA)和企业服务总线(ESB)
    IBM网站 构建您的SOA 系列文章
    Visual Studio 2008 和 .NET Framework 3.5 Training Kit
    模式与实践 系列发布WCF Security Guidance 1.0
    跟NHibernate之夏一起学习NHibernate
    ORACLE一些不常用的脚本
    ORACLE已建表能否创建分区
    Access数据库问题锦集
  • 原文地址:https://www.cnblogs.com/c7jie/p/13055315.html
Copyright © 2011-2022 走看看