if (name == null) { // Get request body dynamic data = await req.Content.ReadAsAsync<object>(); name = data?.name; }
return name == null ? req.CreateResponse(HttpStatusCode.BadRequest, "Please pass a name on the query string or in the request body") : req.CreateResponse(HttpStatusCode.OK, "Hello " + name); }
啟用 Function App 的 Managed Identity
移動到 Functions Apps 的 Settings > Identity, 可以看 System assigned > Status 將它切換為 On. 這一步的設定是為了讓服務之間可以受到 AAD 控管而不需要你自行處理.
// Get var testKV = Environment.GetEnvironmentVariable("TestKV", EnvironmentVariableTarget.Process);
而如果你需要寫入請使用 Azure SDK Client Library
1 2 3 4 5 6 7
using Azure.Identity; using Azure.Security.KeyVault.Secrets; /// Skip ... /// Set var kvUri = $"https://{KeyVaultName}.vault.azure.net"; var client = new SecretClient(new Uri(kvUri), new DefaultAzureCredential()); client.SetSecret($"{SecretKey}", $"{SecretValue}");
[oh-my-zsh] For safety, we will not load completions from these directories until [oh-my-zsh] you fix their permissions and ownership and restart zsh. [oh-my-zsh] See the above list for directories with group or other writability.
[oh-my-zsh] To fix your permissions you can do so by disabling [oh-my-zsh] the write permission of "group" and "others" and making sure that the [oh-my-zsh] owner of these directories is either root or your current user. [oh-my-zsh] The following command may help: [oh-my-zsh] compaudit | xargs chmod g-w,o-w
[oh-my-zsh] If the above didn't help or you want to skip the verification of [oh-my-zsh] insecure directories you can set the variable ZSH_DISABLE_COMPFIX to [oh-my-zsh] "true" before oh-my-zsh is sourced in your zshrc file.
- Each game, or “line” of bowling, includes ten turns, or “frames” for the bowler. - In each frame, the bowler gets up to two tries to knock down all the pins. - If in two tries, he fails to knock them all down, his score for that frame is the total number of pins knocked down in his two tries. - If in two tries he knocks them all down, this is called a “spare” and his score for the frame is ten plus the number of pins knocked down on his next throw (in his next turn). - If on his first try in the frame he knocks down all the pins, this is called a “strike”. His turn is over, and his score for the frame is ten plus the simple total of the pins knocked down in his next two rolls. - If he gets a spare or strike in the last (tenth) frame, the bowler gets to throw one or two more bonus balls, respectively. These bonus throws are taken as part of the same turn. If the bonus throws knock down all the pins, the process does not repeat: the bonus throws are only used to calculate the score of the final frame. - The game score is the total of all frame scores.
publicint? Calculate(List<int> fellPins) { var frames = new List<Frame>();
//todo remove this condition after pass single frame test if (fellPins.Count == 2) { if (fellPins[0] != 10) { frames.Add(new Frame(fellPins[0], fellPins[1])); } } if (fellPins.Count == 3 && fellPins[0] + fellPins[1] == 10) { var frame = new Frame(fellPins[0], fellPins[1]); frame.SetBonus(fellPins[2]); frames.Add(frame); } for (int i = 0; i < fellPins.Count; i++) { frames.Add(new Frame(fellPins[0])); } return NullableSum(frames); }
publicint? Calculate(List<int> fellPins) { var frames = new List<Frame>(); //todo remove this condition after pass single frame test if (fellPins.Count == 2) { if (fellPins[0] != 10) { frames.Add(new Frame(fellPins[0], fellPins[1])); } } if (fellPins.Count == 3 && fellPins[0] + fellPins[1] == 10) { var frame = new Frame(fellPins[0], fellPins[1]); frame.SetBonus(fellPins[2]); frames.Add(frame); } for (int i = 0; i < fellPins.Count; i++) { frames.Add(new Frame(fellPins[0])); }
return NullableSum(frames); }
我們建一個 For Loop 目標要將這些醜醜的 if 判斷式移到 Loop 之中 結果大致如下, 過程當然也是逐步的抽離
[Fact] publicvoidtestSimpleAddition() { Money five = Money.dollar(5); IExpression sum = five.plus(five); Bank bank = new Bank(); Money reduce = bank.reduce(sum,"USD"); Assert.Equal(Money.dollar(10), reduce); }
IExpression result = five.plus(five); Sum sum = (Sum) result;
這個時候編譯會失敗, 原因是 Sum 未實作 IExpression 介面, 一樣一個Commit搞定他 重新跑一下測試, 還是紅燈但是錯誤訊息變了, 無法將 Money 轉型成 Sum
System.InvalidCastException Unable to cast object of type ‘Marsen.NetCore.Dojo.Tests.Books.TddByExample.Money’ to type ‘Marsen.NetCore.Dojo.Tests.Books.TddByExample.Sum’.`