<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          .NET 7.0+WebAPI 后端架構(gòu)實戰(zhàn)

          共 6245字,需瀏覽 13分鐘

           ·

          2023-10-24 10:59


          ?前言
          從實習到現(xiàn)在回想自己已經(jīng)入行四年了,很慶幸自己一直還是從事著開發(fā)的工作。

          這幾年不管是工作還是生活都有很多不甘與失落還有收獲,從學校出來之后有時候覺得自己的心態(tài)受不了小小的打擊,可能就像平凡的世界中的孫少平一樣,有著一顆敏感而脆弱的自尊心。

          春種一粒粟,秋收萬顆子。從2021年1月份到現(xiàn)在一直沒有更新過博客,在這個播種的季節(jié)我想我應(yīng)該要總結(jié)一下過去的技術(shù)經(jīng)驗,對自己是提升,對別人可能或多或少都有幫助。

          阿里巴巴大神畢玄曾說過,"一個優(yōu)秀的工程師和一個普通工程師的區(qū)別,不是滿天飛的架構(gòu)圖,他的功底體現(xiàn)在所寫的每一行代碼上"。這句話我與諸君共思共勉!

          分層目標

          • 大道至簡:能提高開發(fā)效率,讓剛進公司的實習生也能快速上手CRUD

          • 結(jié)構(gòu)清晰:不僅要遵循DIP原則(降低耦合),而且也要保證每一層或每一個類庫職責單一,減少后期維護成本

          • 擴展/復用:分層之后有很高的復用性和更方便的橫向擴展性

          傳統(tǒng)三層架構(gòu)

          傳統(tǒng)的三層架構(gòu):表現(xiàn)層、業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層,如下圖所示:

          DDD四層架構(gòu)

          基于DDD的四層架構(gòu):用戶接口層、應(yīng)用層、領(lǐng)域?qū)雍突A(chǔ)設(shè)施層,如下圖所示:

          與傳統(tǒng)的三層架構(gòu)相比DDD的分層架構(gòu)將業(yè)務(wù)邏輯層拆為了應(yīng)用層與領(lǐng)域?qū)?/span>

          下方左圖為傳統(tǒng)四層架構(gòu),右圖為依賴倒置后的四層架構(gòu)。應(yīng)用層與領(lǐng)域?qū)犹峁┙涌冢A(chǔ)設(shè)施層提供實現(xiàn)。

          領(lǐng)域?qū)硬灰蕾嚾魏我粚樱粚W⑴c業(yè)務(wù)。個人認為基礎(chǔ)設(shè)施層迭代頻率要低于接口層,抽象程度高于表現(xiàn)層。所以讓表現(xiàn)層依賴基礎(chǔ)設(shè)施層更合適。

          我的本系列博客對應(yīng)的項目也是基于DDD的架構(gòu)思想,當然也會加入自己的一些想法在其中。

          想學習領(lǐng)域驅(qū)動設(shè)計的同學可移步《DDD 實戰(zhàn)課》

          項目結(jié)構(gòu)

          整體項目結(jié)構(gòu)如下方三張圖所示:

          層級介紹

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

          2、ICore.Application這一層很薄,不會包含任何與業(yè)務(wù)有關(guān)的邏輯信息,將使用CQRS的設(shè)計模式。安全認證、權(quán)限校驗、事務(wù)控制、發(fā)送或訂閱領(lǐng)域事件等都可在此層做處理。

          3、ICore.Task這一層主要用于處理系統(tǒng)內(nèi)小型定時任務(wù)。繁多、復雜的定時任務(wù)建議用第三方調(diào)度平臺,例如:XXL-JOB。

          4、ICore.Domain.Core這一層主要用于實現(xiàn)核心的業(yè)務(wù)邏輯!內(nèi)部主要包含Entity(實體)、Domain Event(領(lǐng)域事件)、Domain Service(領(lǐng)域服務(wù))等。

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

          6、ICore.Infrastructure.Core這一層主要對整個應(yīng)用程序提供基礎(chǔ)實現(xiàn),例如倉儲的實現(xiàn)、工作單元模式的實現(xiàn)、Redis緩存、隊列服務(wù)等。

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

          其它規(guī)范

          編碼、格式規(guī)范

          我強烈建議大家看阿里巴巴Java開發(fā)手冊,以上面的規(guī)范來約束自己的編碼。

          配置文件規(guī)范

          • 全部采用json格式文件
          • 建立映射類,使用IOptions< T>方式讀取配置信息
          • 數(shù)據(jù)庫連接字符串、數(shù)據(jù)傳輸?shù)募用苊荑€等不建議寫在配置文件中,應(yīng)放到分布式配置中心中

          安全規(guī)范(只列舉部分)

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

          啟動項目

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

          修改端口

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

          2、在appsettings.json中設(shè)置啟動端口

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

          3、在Program中設(shè)置啟動端口

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

          加入Startup.cs

          從.NET 6.0開始已去除了Startup.cs 文件,依賴注入服務(wù)和Middleware全在Program.cs中配置。

          我從寫.NET Core 2.0開始一直到現(xiàn)在,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

          這一節(jié)就到這里,后面會繼續(xù)上新!

          轉(zhuǎn)自:江北

          鏈接:cnblogs.com/zhangnever/p/17093919.html







          回復 【關(guān)閉】學永久關(guān)閉App開屏廣告
          回復 【刪除】學自動檢測那個微信好友刪除、拉黑
          回復 【福利】學查看微粒貸額度獲取20元微信紅包
          回復 【手冊】獲取3萬字.NET、C#工程師面試手冊
          回復 【幫助】獲取100+個常用的C#幫助類庫
          回復 【加群】加入DotNet學習交流群

          瀏覽 1010
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  精品国产一区二区三区无码 | 小14萝裸乳 无码无遮 | 国产精品伦子伦免费 | 99精产秘 18 在线观看 | 成人毛片女人18女人 |