.NET 整合測試 nUnit

這次主要的出發點是測試從原本自己刻的http client換成refit來讓程式碼更簡潔

那就必須確保資料最後都一致

可能會有的問題例如datetime的轉換

那一開始我就重新從config取設定然後注入用

RestService.For<IGitHubApi>()

這樣的方式注入,然後用字串取得Interface

但是這樣重新注入就測不到本身設定有沒有問題,因為重新刻了

繼續閱讀 “.NET 整合測試 nUnit"

[速寫] Vue3 + Vite的Dynamic import踩坑

從一個全新的vue3專案開始 今天要放到IIS上面測

原本用一個很開心的Mapping給dynamic import的路徑 結果呢 燈燈

直接抓不到

那為甚麼呢 在打包的時候用的是rollup

他不能整個路徑都用變數 他有規範在Doc裡面 找到就解了

https://github.com/rollup/plugins/tree/master/packages/dynamic-import-vars#limitations

繼續閱讀 “[速寫] Vue3 + Vite的Dynamic import踩坑"

dotnet Quartz 排程工作

在找如何在後端自動排程的時候 最簡單的就是IScheduler

多找幾篇之後有幾個選項 但其實就是主要看到的文件 跟 文章都偏向quartz 就直接用了

主要參考這一篇:https://dotblogs.com.tw/wasichris/2020/12/16/172524

官方文件:https://www.quartz-scheduler.net/

基本上的架構就是 scheduler & job

開job做為要做的工作注入

自動排程

他可以設定簡單的定時/定點、日曆等等

那我選用cronexpression來讓我決那些分鐘跑一次

切換頻率

因為更改一開始注入的job不可能,因為是用cronexpression注入singelton

所以我改為兩種不同頻率的job 一個預設暫停

我在這邊有改寫scheduler 增加一個叫做 run on start

在Task StartAsync裡面linq的時候增加run on start = true

然後就分別暫停/開啟相互切換job

不過遇到的問題就是切換的時候兩個都執行了 不過目前影響不大就先這樣

在Window佈署Apache & Flask

這次是要佈署一個tensorflow的影像辨識在目前的系統上,既有的方式是在.NET上面呼叫bat檔案 再執行py檔完成這件事情

這樣做主要有幾個問題

速度慢:在每一次的request都需要重新開啟py檔,代表都會重新import,尤其tensorflow本身就需要時間

Debug困難:因為所有的錯都無法讀到,在.NET這邊就只會timeout error

先前的開發使用了試誤法,把環境變數 conda的環境位置都設定在bat檔案裏面才能開

SET python_root=
SET miniconda_root=
SET PATH=

這些設定好之後才能順利執行

而這次由於Debug實在太麻煩,我就決定直接寫Flask API把他完成

在執行面很快就可以架好一個local host在windows server上面,但是問題是要如何正式佈署

就是在重開機等操作之後仍正常開啟

我試過了 本篇文章 是利用windows task manager自動執行bat

不過也是不好debug,於是我就看到了用Apache開Flask

於是 第一步是開啟Apache

下載好Apache (從Apache Lounge) 之後解壓縮到 C:\Apache24

執行裡面bin\httpd.exe 就會在 local host看到 it works的字樣代表成功

這裡第一個會遇到的問題就是 如果預設的80 port已經有開了什麼服務,就必須換一個port

在 conf資料夾裡面的 httpd.conf可以修改

然後接下來就是要開啟Flask

在想要的資料夾 這裡用C:\dev

我試過好像在太多層也會出一些問題

資料夾裡面就是 appname資料夾 裡面放 __init__.py; wsgi_scripts資料夾裡面放appname.wsgi

結論 windows就用IIS佈署好了

自己架設Nuget server

如果遇到通用套件,自己內部使用又不想放到外面,除了使用dll傳送檔案之外,自己架設一個nuget server就是可以使用的選項

那在看microsoft自己的官方nuget server的時候,發現是dotnet framework,github的星星數量也才幾百,多找了幾個之後,選用Baget Server

原本的nuget server的問題就是會遇到core NET 5 6等 target framework的時候就會跑不出來

https://loic-sharma.github.io/BaGet/

在我測試Baget的時候都沒有遇到問題

不過需要再研究是 他接到database做搜尋的方式

那目前有做出來的就是

針對不同的framework

  <PropertyGroup>
    <TargetFrameworks>
		netstandard2.1;
		netcoreapp2.1;
		netcoreapp2.2;
		netcoreapp3.0;
		netcoreapp3.1;
		net5.0;
		net6.0;
	</TargetFrameworks>
    <Version>1.1.1</Version>
  </PropertyGroup>

在不同的framework用不同的dependency

<ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.1' ">
    <Reference Include="System.Net" />
    <PackageReference Include="Newtonsoft.Json" Version="6.0.5" />
</ItemGroup>

<ItemGroup Condition=" '$(TargetFramework)' == 'net5.0' ">
    <Reference Include="System.Net.Http" />
    <Reference Include="System.Threading.Tasks" />
    <PackageReference Include="Newtonsoft.Json" Version="8.0.3" />
</ItemGroup>

<ItemGroup Condition=" '$(TargetFramework)' == 'net6.0' ">
    <Reference Include="System.Net.Http" />
    <Reference Include="System.Threading.Tasks" />
    <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>

在不同framework做不同的事情

        public static string version()
        {
#if NET5_0
            return "5.0";
#elif NET6_0
            return "6";
#elif NETCOREAPP2_1
            return "21";
#else
            return "else";
#endif
        }

AspNet 新增user/role表格

在用了預設的 identity之後 就會要加欄位了

原本的用法是有userstore/ usermanager rolestore rolemanager

以下是已經改好之後的設定

        private UserStore<ApplicationUser> userStore;
        private UserManager<ApplicationUser> userManager;
        private RoleStore<ApplicationRole> roleStore;
        private RoleManager<ApplicationRole> roleManager;

            userStore = new UserStore<ApplicationUser>(applicationDbContext);
            userManager = new UserManager<ApplicationUser>(userStore);
            userManager.UserValidator = new UserValidator<ApplicationUser>(userManager) { AllowOnlyAlphanumericUserNames = false };
            roleStore = new RoleStore<ApplicationRole>(applicationDbContext);
            roleManager = new RoleManager<ApplicationRole>(roleStore);
繼續閱讀 “AspNet 新增user/role表格"

CODER的隨手筆記系列-註解

註解寫的是 為什麼要這樣做 程式碼本身就說明了做了什麼

例如 因為這裡要先排除undefined才能開始

或是 先檢查工程編號格式是否正確

抑或是 當下的trade-off

因為某些困難點,只能先放技術債在這邊,如果真的要重構的時候再來做