<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Dotnet on @metavige</title><link>https://metavige.github.io/tags/dotnet/</link><description>Recent content in Dotnet on @metavige</description><generator>Hugo</generator><language>zh-TW</language><lastBuildDate>Wed, 19 Nov 2025 09:30:00 +0800</lastBuildDate><atom:link href="https://metavige.github.io/tags/dotnet/atom.xml" rel="self" type="application/rss+xml"/><item><title>Aspire 13</title><link>https://metavige.github.io/2025/11/19/2025-11-19-aspire/</link><pubDate>Wed, 19 Nov 2025 09:30:00 +0800</pubDate><guid>https://metavige.github.io/2025/11/19/2025-11-19-aspire/</guid><description>&lt;h2 id="一個專案的開始" class="relative group"&gt;一個專案的開始 &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#%e4%b8%80%e5%80%8b%e5%b0%88%e6%a1%88%e7%9a%84%e9%96%8b%e5%a7%8b" aria-label="定位點"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;開發專案時，通常會在本地端進行，並結合 Database 和 Cache 等服務。目前常見的做法是使用 Docker 啟動 Database 或 Cache container 來建立本地測試環境，而非直接連線到公司提供的測試環境。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt;14
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt;15
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt;16
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt;17
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7ee787"&gt;version&lt;/span&gt;:&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#39;3.9&amp;#39;&lt;/span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7ee787"&gt;services&lt;/span&gt;:&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#7ee787"&gt;postgres&lt;/span&gt;:&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#7ee787"&gt;image&lt;/span&gt;:&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;postgres:16&lt;/span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#7ee787"&gt;container_name&lt;/span&gt;:&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;my_postgres&lt;/span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#7ee787"&gt;restart&lt;/span&gt;:&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;always&lt;/span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#7ee787"&gt;environment&lt;/span&gt;:&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#7ee787"&gt;POSTGRES_USER&lt;/span&gt;:&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;myuser&lt;/span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#7ee787"&gt;POSTGRES_PASSWORD&lt;/span&gt;:&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;mypassword&lt;/span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#7ee787"&gt;POSTGRES_DB&lt;/span&gt;:&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;mydb&lt;/span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#7ee787"&gt;ports&lt;/span&gt;:&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;- &lt;span style="color:#a5d6ff"&gt;&amp;#34;5432:5432&amp;#34;&lt;/span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#7ee787"&gt;volumes&lt;/span&gt;:&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;- &lt;span style="color:#a5d6ff"&gt;pg_data:/var/lib/postgresql/data&lt;/span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7ee787"&gt;volumes&lt;/span&gt;:&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#7ee787"&gt;pg_data&lt;/span&gt;:&lt;span style="color:#6e7681"&gt; &lt;/span&gt;{}&lt;span style="color:#6e7681"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;以上面的例子來說，你需要先有以下的知識：&lt;/p&gt;</description></item><item><title>.Net Standard 筆記</title><link>https://metavige.github.io/2017/08/31/dotnet-standard-note/</link><pubDate>Thu, 31 Aug 2017 21:09:47 +0800</pubDate><guid>https://metavige.github.io/2017/08/31/dotnet-standard-note/</guid><description>&lt;h2 id="簡單筆記" class="relative group"&gt;簡單筆記 &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#%e7%b0%a1%e5%96%ae%e7%ad%86%e8%a8%98" aria-label="定位點"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;標準的基礎程式庫 API 介面定義&lt;/li&gt;
&lt;li&gt;可以跨平台&lt;/li&gt;
&lt;li&gt;目前 .Net framework 4.6.1 支援 .Net Standard 2.0 (.Net Standard 1.x 僅有 .Net Code 1.x 支援)&lt;/li&gt;
&lt;li&gt;.Net Standard 版本控制規則
&lt;ul&gt;
&lt;li&gt;累加：較新的版本會包含較舊版本的 API&lt;/li&gt;
&lt;li&gt;不可變：版本提交後，該版本便已凍結&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;自行根據 PCL (Portable Class Library)，決定設定檔集合 (就是決定要用哪套實作的程式庫，看是要用 .Net framework 或是 .Net Core)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="架構圖" class="relative group"&gt;架構圖 &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#%e6%9e%b6%e6%a7%8b%e5%9c%96" aria-label="定位點"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;






 
 
&lt;figure&gt;&lt;img src="https://docs.microsoft.com/zh-tw/dotnet/standard/media/components.png" alt="" class="mx-auto my-0 rounded-md" /&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="網路介紹文章" class="relative group"&gt;網路介紹文章 &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#%e7%b6%b2%e8%b7%af%e4%bb%8b%e7%b4%b9%e6%96%87%e7%ab%a0" aria-label="定位點"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.darkthread.net/post-2016-09-27-net-standard-2-0.aspx" target="_blank" rel="noreferrer"&gt;2016.09.27 .NET Standard 2.0 是什麼？可以吃嗎？ (黑暗執行緒)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dotblogs.com.tw/aspnetshare/2016/04/10/20160409-netcore-netstandard" target="_blank" rel="noreferrer"&gt;2016.04.10 ASP.NET Core 與 .Net Core, .Net Platform Standard, 以及 Shared Runtime 之間的關係 (微軟開發工具的資訊分享)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bruceyclee.tw/2017/02/25/netstandard/" target="_blank" rel="noreferrer"&gt;2017.02.25 再來多聊一點 .Net Standard (大毛電腦科學筆記)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dotblogs.com.tw/gelis/2017/08/20/143437" target="_blank" rel="noreferrer"&gt;2017-08-20 .NET Standard 2.0 與 .NET 的未來與發展 (gelis 技術隨筆)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Akka.Net 不錯用</title><link>https://metavige.github.io/2017/02/13/akkadotnet-good/</link><pubDate>Mon, 13 Feb 2017 00:00:00 +0800</pubDate><guid>https://metavige.github.io/2017/02/13/akkadotnet-good/</guid><description>&lt;p&gt;真的使用之後，越來越覺得 Actor Model 是個好物，因為他本來就是拿來做平行運算用的。&lt;/p&gt;
&lt;p&gt;建議可以先從以下的幾篇文章以及 Github 的範例開始&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://petabridge.com/training/akka-design-patterns/" target="_blank" rel="noreferrer"&gt;Akka.Net Application Architecture and Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://petabridge.com/training/akka-remoting/" target="_blank" rel="noreferrer"&gt;Building Networked .NET Applications with Akka.Remote&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://petabridge.com/training/akka-clustering/" target="_blank" rel="noreferrer"&gt;.NET Distributed Systems Architecture and Design with Akka.Cluster&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="好處" class="relative group"&gt;好處 &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#%e5%a5%bd%e8%99%95" aria-label="定位點"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;我剛開始做的時候，其實是想到 Sequence Diagram。因為 Actor Model 的重點其實就是在訊息的傳遞與處理，只是在整體架構上有一個 ActorSystem 幫忙做處理&lt;/p&gt;
&lt;p&gt;根據以下的圖片&lt;/p&gt;
&lt;p&gt;






 
 
&lt;figure&gt;&lt;img src="http://getakka.net/docs/images/actor.png" alt="" class="mx-auto my-0 rounded-md" /&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;一個 Actor 在建立之後，&lt;a href="http://getakka.net" target="_blank" rel="noreferrer"&gt;AkkaDotNet&lt;/a&gt; 會幫你建立整個 Actor 的基本行為。
包含一個 Mailbox、預設的狀態等，而且也預設了每個 Actor 都有可以有 Children Actors
所以，當你傳遞一個訊息給 Actor 的時候，其實不是直接呼叫 Actor 中處理訊息的方法，而是先進入 Mailbox，類似郵件的方式排隊處理。&lt;/p&gt;
&lt;p&gt;當處理有問題的時候，你是可以在 Handle 方法中，直接拋出錯誤，讓 Actor 失敗。如此一來就會觸發上層 Actor 的 SupervisorStrategy。預設的 Strategy 可以參考 &lt;a href="http://getakka.net/docs/Fault%20tolerance" target="_blank" rel="noreferrer"&gt;Fault Tolerance&lt;/a&gt; 文件&lt;/p&gt;</description></item><item><title>在 .Net 專案使用 gulp build</title><link>https://metavige.github.io/2015/12/12/dotnet-proj-with-gulp/</link><pubDate>Sat, 12 Dec 2015 09:58:06 +0800</pubDate><guid>https://metavige.github.io/2015/12/12/dotnet-proj-with-gulp/</guid><description>&lt;p&gt;一直以來，開發 .Net 專案，因為只能在 Windows 上使用 Visual Studio 開發&lt;br&gt;
Build Project 的 Performance 總是我一個覺得很麻煩的事情&lt;/p&gt;</description></item><item><title>log4net Action Log 設定</title><link>https://metavige.github.io/2015/03/25/log4net-actionlog/</link><pubDate>Wed, 25 Mar 2015 09:00:00 +0800</pubDate><guid>https://metavige.github.io/2015/03/25/log4net-actionlog/</guid><description>&lt;p&gt;我之前設定網站執行的 Action Log 的一個記錄，有些東西都是拼拼湊湊出來的，並不見得是最佳版本&lt;/p&gt;
&lt;p&gt;log4net 設定檔&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt;14
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt;15
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt;16
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt;17
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt;18
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt;19
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt;20
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt;21
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt;22
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt;23
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt;24
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b949e;font-weight:bold;font-style:italic"&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34; ?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7ee787"&gt;&amp;lt;log4net&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7ee787"&gt;&amp;lt;root&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7ee787"&gt;&amp;lt;level&lt;/span&gt; value=&lt;span style="color:#a5d6ff"&gt;&amp;#34;DEBUG&amp;#34;&lt;/span&gt; &lt;span style="color:#7ee787"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7ee787"&gt;&amp;lt;appender-ref&lt;/span&gt; ref=&lt;span style="color:#a5d6ff"&gt;&amp;#34;stdout&amp;#34;&lt;/span&gt; &lt;span style="color:#7ee787"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7ee787"&gt;&amp;lt;appender-ref&lt;/span&gt; ref=&lt;span style="color:#a5d6ff"&gt;&amp;#34;ActionLogRollingFile&amp;#34;&lt;/span&gt; &lt;span style="color:#7ee787"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7ee787"&gt;&amp;lt;/root&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7ee787"&gt;&amp;lt;appender&lt;/span&gt; name=&lt;span style="color:#a5d6ff"&gt;&amp;#34;ActionLogRollingFile&amp;#34;&lt;/span&gt; type=&lt;span style="color:#a5d6ff"&gt;&amp;#34;log4net.Appender.RollingFileAppender&amp;#34;&lt;/span&gt;&lt;span style="color:#7ee787"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7ee787"&gt;&amp;lt;file&lt;/span&gt; type=&lt;span style="color:#a5d6ff"&gt;&amp;#34;log4net.Util.PatternString&amp;#34;&lt;/span&gt; value=&lt;span style="color:#a5d6ff"&gt;&amp;#34;action.log&amp;#34;&lt;/span&gt; &lt;span style="color:#7ee787"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7ee787"&gt;&amp;lt;appendToFile&lt;/span&gt; value=&lt;span style="color:#a5d6ff"&gt;&amp;#34;true&amp;#34;&lt;/span&gt; &lt;span style="color:#7ee787"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7ee787"&gt;&amp;lt;encoding&lt;/span&gt; value=&lt;span style="color:#a5d6ff"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt; &lt;span style="color:#7ee787"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7ee787"&gt;&amp;lt;maxSizeRollBackups&lt;/span&gt; value=&lt;span style="color:#a5d6ff"&gt;&amp;#34;30&amp;#34;&lt;/span&gt; &lt;span style="color:#7ee787"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7ee787"&gt;&amp;lt;rollingStyle&lt;/span&gt; value=&lt;span style="color:#a5d6ff"&gt;&amp;#34;Date&amp;#34;&lt;/span&gt; &lt;span style="color:#7ee787"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7ee787"&gt;&amp;lt;datePattern&lt;/span&gt; value=&lt;span style="color:#a5d6ff"&gt;&amp;#34;&amp;#39;.&amp;#39;yyyy-MM-dd&amp;#34;&lt;/span&gt; &lt;span style="color:#7ee787"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7ee787"&gt;&amp;lt;layout&lt;/span&gt; type=&lt;span style="color:#a5d6ff"&gt;&amp;#34;log4net.Layout.PatternLayout&amp;#34;&lt;/span&gt;&lt;span style="color:#7ee787"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7ee787"&gt;&amp;lt;conversionPattern&lt;/span&gt; value=&lt;span style="color:#a5d6ff"&gt;&amp;#34;(%date{HH:mm:ss,fff}) [%t] - %u %5property{Duration} %property{StatusCode} %6property{Method} %property{Uri} %m%n &amp;#34;&lt;/span&gt; &lt;span style="color:#7ee787"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7ee787"&gt;&amp;lt;/layout&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7ee787"&gt;&amp;lt;filter&lt;/span&gt; type=&lt;span style="color:#a5d6ff"&gt;&amp;#34;log4net.Filter.LoggerMatchFilter&amp;#34;&lt;/span&gt;&lt;span style="color:#7ee787"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7ee787"&gt;&amp;lt;acceptOnMatch&lt;/span&gt; value=&lt;span style="color:#a5d6ff"&gt;&amp;#34;true&amp;#34;&lt;/span&gt; &lt;span style="color:#7ee787"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7ee787"&gt;&amp;lt;LoggerToMatch&lt;/span&gt; value=&lt;span style="color:#a5d6ff"&gt;&amp;#34;Sample.Web.Filters.WebApiActionFilter&amp;#34;&lt;/span&gt; &lt;span style="color:#7ee787"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7ee787"&gt;&amp;lt;/filter&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7ee787"&gt;&amp;lt;filter&lt;/span&gt; type=&lt;span style="color:#a5d6ff"&gt;&amp;#34;log4net.Filter.DenyAllFilter&amp;#34;&lt;/span&gt; &lt;span style="color:#7ee787"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7ee787"&gt;&amp;lt;/appender&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7ee787"&gt;&amp;lt;/log4net&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;其中要注意的是&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;log4net.Filter.LoggerMatchFilter: 用來設定特定的 class 記錄才使用這個 Appender
&lt;ul&gt;
&lt;li&gt;acceptOnMatch: 這個設定有點像是 blacklist/whitelist，true 表示有 match 才是，相當於 whitelist&lt;/li&gt;
&lt;li&gt;LoggerToMatch: 設定要篩選的類別名稱&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;log4net.Filter.DenyAllFilter: 篩選掉其他的 Log，不會在這個 Appender 裡面記錄&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>dotNetConf 2014</title><link>https://metavige.github.io/2014/07/12/dotNetConf-2014/</link><pubDate>Sat, 12 Jul 2014 10:00:00 +0800</pubDate><guid>https://metavige.github.io/2014/07/12/dotNetConf-2014/</guid><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/b/dotnet/archive/2014/07/02/dotnetconf-2014-wrapup.aspx" target="_blank" rel="noreferrer"&gt;dotNetConf 2014&lt;/a&gt; 的影片已經可以在 Channel 9 找到了&lt;/p&gt;
&lt;p&gt;我看了三個項目&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://channel9.msdn.com/Events/dotnetConf/2014/The-State-of-NET" target="_blank" rel="noreferrer"&gt;(KeyNote) .Net State&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://channel9.msdn.com/Events/dotnetConf/2014/MVC-6" target="_blank" rel="noreferrer"&gt;Asp.Net MVC 6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://channel9.msdn.com/Events/dotnetConf/2014/New-Innovations-in-NET-Runtime" target="_blank" rel="noreferrer"&gt;New Innovation in .Net&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;老實說改變很大&lt;/p&gt;</description></item><item><title>Unity + SharpRepository</title><link>https://metavige.github.io/2013/11/19/unity-sharprepository/</link><pubDate>Tue, 19 Nov 2013 15:38:00 +0800</pubDate><guid>https://metavige.github.io/2013/11/19/unity-sharprepository/</guid><description>&lt;p&gt;最近在學習使用 &lt;a href="https://github.com/SharpRepository/SharpRepository" target="_blank" rel="noreferrer"&gt;SharpRepository&lt;/a&gt;，剛好專案中有使用 IoC Container - Unity, 所以需要把兩者做一個結合&lt;/p&gt;</description></item></channel></rss>