<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>.Net on</title><link>https://tonny0531.github.io/categories/.net/</link><description>Recent content in .Net on</description><generator>Hugo -- gohugo.io</generator><lastBuildDate>Sun, 09 Apr 2023 13:55:48 +0900</lastBuildDate><atom:link href="https://tonny0531.github.io/categories/.net/index.xml" rel="self" type="application/rss+xml"/><item><title>NUnit Test Project Init</title><link>https://tonny0531.github.io/post/dotnet/test/init/</link><pubDate>Sun, 09 Apr 2023 13:55:48 +0900</pubDate><guid>https://tonny0531.github.io/post/dotnet/test/init/</guid><description>前言 前面已經有寫了幾篇關於解耦合，抽象行為等等概念的說明了．
而建置測試專案雖然已經做了第二次了，但發現兩次我都會忘記怎麼做，因此才特別寫了這篇初始化的文章出來
碰到問題 在.NET Core 開發的過程中，都知道有IServiceProvider和IConfiguration這兩個介面可以取得實例或是Config的配置
但正常情況下都被框架包好了，根本不用去考慮他怎麼做出來的．
但在測試的途中，框架不會知道你是否要使用，因此也不會自動幫你建立一個出來，導致我們需要自己來建立．
建立專案 由於我現在的開發環境是 Mac OS 因此這裡就只示範 VSCode &amp;amp; .NET CLI
dotnet new nunit -n {ProjectName} 如果是6版本以上的話，會自動建立using.cs
這個是GloableUsing的部分，如果有全域要使用的using的話可以考慮放到這裡
Nunit的介紹 正常來講在寫整合測試的時候，我們為了減少變因，因此都會做一次初始化以及完畢的行為
例如：初始化建立相依的物件(DB,Redis等等相關連線)
完畢的時候要刪除測試的資料等等行為
而在NUnit中的屬性則叫做Setup(初始) &amp;amp; TearDown(結束)
實際上寫出來會長得像這樣
[SetUp] public void SetUp() { //初始化區塊 } [TearDown] public void TearDown() { //測試完成後執行的區塊 } 建立IServiceProvider &amp;amp; IConfiguration 建立方式其實沒有很困難，實際方式如下
protected IServiceCollection _services; protected IServiceProvider _sp; protected IConfiguration _configuration; [SetUp] public void SetUp() { // 先建立新的ServiceCollection this.</description></item><item><title>Dependency Injection 與工廠模式的結合(2)</title><link>https://tonny0531.github.io/post/dotnet/di/factorywork/</link><pubDate>Thu, 06 Apr 2023 12:48:19 +0900</pubDate><guid>https://tonny0531.github.io/post/dotnet/di/factorywork/</guid><description>前言 前面一篇提到了 DI 的概念，透過 DI 的方式來實現解耦合，而這篇則是要來講 DI 的一些進階應用了
工廠模式 先說明工廠模式的運作方式，直接看Code比較快
資料來源
// Empty vocabulary of actual object public interface IPerson { string GetName(); } public class Villager : IPerson { public string GetName() { return &amp;#34;Village Person&amp;#34;; } } public class CityPerson : IPerson { public string GetName() { return &amp;#34;City Person&amp;#34;; } } public enum PersonType { Rural, Urban } /// &amp;lt;summary&amp;gt; /// Implementation of Factory - Used to create objects.</description></item><item><title>Dependency Injection 與工廠模式的結合(1)</title><link>https://tonny0531.github.io/post/dotnet/di/agenda/</link><pubDate>Wed, 15 Feb 2023 12:35:19 +0800</pubDate><guid>https://tonny0531.github.io/post/dotnet/di/agenda/</guid><description>Dependency Injection 簡介 Dependency Injection 是一種物件改變耦合的一種設計概念，通常會跟 IOC(Inversion Of Control) 一起談
以下一個簡單的注入範例
範例 故事 父母今天要教育小孩科目，但一對父母並不是只會擁有一個小孩，可能會有多個。因此我們把小孩當作參數傳給教育小孩這個方法，使其變得有彈性。
方法中注入小孩其實就是 方法注入(Method Injection)
創建小孩的過程會注入一個姓名，這種注入方式就是 建構式注入(Constructor Injection)
透過物件設定值的方式，就是 屬性注入(Property Injection)
Struct public interface IParent { void TeachChild (IClild child, Subject string); } public class Parent: IParent { public Parent () { } public void TeachChild (IClild child, string subject ) { Console.WriteLine($&amp;#34;Teach {child.GetName} about ${subject}&amp;#34;) } } public interface IChild { string GetName (); void SetAge(int age); } public class Child { private string _childName; private int _age; public Child (string name) { this.</description></item><item><title>Docker Image Certificate 信任問題</title><link>https://tonny0531.github.io/post/dotnet/certificate/</link><pubDate>Wed, 08 Feb 2023 11:31:27 +0800</pubDate><guid>https://tonny0531.github.io/post/dotnet/certificate/</guid><description>前言 繼上一篇做了 Kestrel Port 的大概說明後，後來又發生了一個狀況
因那個 App 會呼叫公司內部的 API 而公司內的API採用了 Https 引發了憑證不信任的問題
以下有兩種避免的作法
HttpClient 注入 HttpClientHandler services.AddHttpClient&amp;lt;JY_COG_FactoryWorkClient&amp;gt;().ConfigurePrimaryHttpMessageHandler(sp =&amp;gt; { return sp.GetRequiredService&amp;lt;SSLClientHandler&amp;gt;(); }); public class SSLClientHandler : HttpClientHandler { public SSLClientHandler() { ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator; } } 在 Docker Image 下新增信任憑證 目前看起來 Dotnet Core Image Kernel 是使用 Ubuntu 參考Ubuntu官網
$ sudo apt-get install -y ca-certificates #預設已經有了 $ sudocp local-ca.crt /usr/local/share/ca-certificates #複製自己的憑證進去 $ sudo update-ca-certificates # 系統更新憑證 而因為我偷懶不想要每次匯，因此就寫在 DockerFile 中</description></item><item><title>Kestrel監聽Port的設定方式</title><link>https://tonny0531.github.io/post/dotnet/kestrel_config/</link><pubDate>Wed, 08 Feb 2023 10:02:24 +0800</pubDate><guid>https://tonny0531.github.io/post/dotnet/kestrel_config/</guid><description>前言 .NET 會紅的一部份很大原因是因為終於實現了跨平台
而原先相依於 IIS 的 HttpServer 也因為跨平台而改採用較小的 Kestrel
也是可以託管給IIS: 詳細參考
而會寫這篇最大的原因還是因為，使用了微軟官方的 DockerImage 進行包裝後，發現都還是 Kestrel 都只會吃到 80 Port
DefaultListen80
而網路上爬了一些文，後來找到官方說明綁定的以下幾種方式
No configuration 預設為 http:localhost:5000 &amp;amp; https:localhost:5001 使用系統環境變數 使用ASPNETCORE_URLS 來決定使用的Port Docker 設定的預設為80，導致此次會發生此問題
使用參數來決定 使用 dotnet XXX.dll --urls http://+:1234 寫死在程式碼中(不推薦) webBuilder.UseKestrel((context, serverOptions) =&amp;gt; { serverOptions.Configure(context.Configuration.GetSection(&amp;quot;Kestrel&amp;quot;)) .Endpoint(&amp;quot;HTTPS&amp;quot;, listenOptions =&amp;gt; { listenOptions.HttpsOptions.SslProtocols = SslProtocols.Tls12; }); }); 透過 Appsetting.</description></item></channel></rss>