.Net Core後端架構實戰【1-項目分層框架設計】

摘要:基於.NET Core 7.0WebApi後端架構實戰【1-項目結構分層設計】  2023/02/05, ASP.NET Core 7.0, VS2022

引言

    從實習到現在回想自己已經入行四年了,很慶幸自己一直還是從事着開發的工作。這幾年不管是工作還是生活都有很多不甘與失落還有
收穫,從學校出來之後有時候覺得自己的心態受不了小小的打擊,可能就像平凡的世界中的孫少平一樣,有着一顆敏感而脆弱的自尊心。春
種一粒粟,秋收萬顆子。從2021年1月份到現在一直沒有更新過博客,在這個播種的季節我想我應該要總結一下過去的技術經驗,對自己是提
升,對別人可能或多或少都有幫助。阿里巴巴大神畢玄曾說過,“一個優秀的工程師和一個普通工程師的區別,不是滿天飛的架構圖,他的功
底體現在所寫的每一行代碼上”。這句話我與諸君共思共勉!

分層目標

  • 大道至簡:能提高開發效率,讓剛進公司的實習生也能快速上手CRUD
  • 結構清晰:不僅要遵循DIP原則(降低耦合),而且也要保證每一層或每一個類庫職責單一,減少後期維護成本
  • 擴展/複用:分層之後有很高的複用性和更方便的橫向擴展性

傳統三層架構

傳統的三層架構:表現層、業務邏輯層和數據訪問層,如下圖所示:

DDD四層架構

 基於DDD的四層架構:用戶接口層、應用層、領域層和基礎設施層,如下圖所示:

與傳統的三層架構相比DDD的分層架構將業務邏輯層拆爲了應用層與領域層

下方左圖爲傳統四層架構,右圖爲依賴倒置後的四層架構。應用層與領域層提供接口,基礎設施層提供實現。領域層不依賴任何一層,只專注與業務。個人認爲基礎設施層迭代頻率要低於接口層,抽象程度高於表現層。所以讓表現層依賴基礎設施層更合適。

我的本系列博客對應的項目也是基於DDD的架構思想,當然也會加入自己的一些想法在其中。

想學習領域驅動設計的同學可移步《DDD 實戰課》

項目結構

整體項目結構如下方三張圖所示:

層級介紹

1.ICore.WebApi這一層主要構建 RESTful 應用程序,提供HTTP服務。管道中間件、過濾器、跨域、路由、模型驗證等都在此配置。

2.ICore.Application這一層很薄,不會包含任何與業務有關的邏輯信息,將使用CQRS的設計模式。安全認證、權限校驗、事務控制、發送或訂閱領域事件等都可在此層做處理。

3.ICore.Task這一層主要用於處理系統內小型定時任務。繁多、複雜的定時任務建議用第三方調度平臺,例如:XXL-JOB。

4.ICore.Domain.Core這一層主要用於實現核心的業務邏輯!內部主要包含Entity(實體)、Domain Event(領域事件)、Domain Service(領域服務)等。

5.ICore.Domain.Abstractions這一層主要用於定義一些基類的接口和領域事件的接口。例如:IAggregateRoot聚合根接口、IEntity、IEntity<TKey> 實體接口等。

6.ICore.Infrastructure.Core這一層主要對整個應用程序提供基礎實現,例如倉儲的實現、工作單元模式的實現、Redis緩存、隊列服務等。

7.ICore.Test這一層主要用於對整個程序的單元測試,減少不必要的BUG以及提高測試效率。

其它規範

編碼、格式規範

我強烈建議大家看阿里巴巴Java開發手冊,以上面的規範來約束自己的編碼。

配置文件規範

  • 全部採用json格式文件
  • 建立映射類,使用IOptions<T>方式讀取配置信息
  • 數據庫連接字符串、數據傳輸的加密密鑰等不建議寫在配置文件中,應放到分佈式配置中心中

安全規範(只列舉部分)

  • 加入惡意請求IP黑名單
  • 防SQL注入攻擊
  • 日誌應記錄請求時間、操作人ID、IP地址、是否成功等重要信息
  • CORS策略應加上白名單限制
  • 生產環境的接口文檔不對外暴露

啓動項目

首先.Net Core同Spring Boot一樣都是自宿主程序,其不是必需在IIS內部託管。實現跨平臺離不開.Net Core內置的kestrel高性能服務器,如下圖所示(圖片來自官網):

修改端口

1、在launchSettings.json文件中修改站點信息,把IIS Express節點刪掉

2、在appsettings.json中設置啓動端口

"Kestrel": {
  "Endpoints": {
    "Https": {
      "Url": "https://*:8000"
    },
    "Http": {
      "Url": "http://*:8001"
    }
  }
}

3、在Program中設置啓動端口

app.Run("http://*:8001");

加入Startup.cs

從.Net6.0開始已去除了Startup.cs 文件,依賴注入服務和Middleware全在Program.cs中配置。

我從寫.Net Core2.0開始一直到現在,Startup.cs文件我覺得還是有必要存在,個人使用習慣而已😉

改造Program.cs

using ICore.WebApi;

var builder = WebApplication.CreateBuilder(args);
var startup = new Startup(builder.Configuration);

startup.ConfigureServices(builder.Services);
startup.Configure(builder.Build());

重寫Startup.cs

namespace ICore.WebApi
{
    public class Startup
    {
        public IConfiguration Configuration { get; }
        public Startup(IConfiguration configuration) => Configuration = configuration;

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
            services.AddEndpointsApiExplorer();
            services.AddSwaggerGen();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(WebApplication app)
        {
            if (app.Environment.IsDevelopment())
            {
                app.UseSwagger();
                app.UseSwaggerUI();
            }

            app.UseAuthorization();

            app.MapControllers();

            app.Run("http://*:8001");
        }
    }
}

Run起來!

使用命令行啓動dotnet ICore.WebApi.dll --urls="http://*:8001" --ip="127.0.0.1" --port=8001

這一節就到這裏,後面會繼續上新!😊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章