.Net Framework Serious(學程)



.Net Framework Serious(學程)

注意: 因為此系列已經沒有新東西可以教了,所以這個學程不會再加入新內容了!

#請來這邊看「.Net Framework Serious(學程)」簡介(Click here)

  • 🚀2-1-TSQL(.NetFramework)扎實打底(Click here)
  • 🚀2-2-C#(.NetFramework)深入解析(Click here)
  • 🚀2-3-Linq(.NetFramework)完全攻略(Click here)
  • 🚀2-4-Asp.NetMVC(.NetFramework)完全精通(Click here)
  • 2-5A-EF(1to3)(.NetFramework)
  • 🚀2-5A-1-EntityFrameworkEpisode1(第1篇)-CodeFirst、DBFirst(Click here)
  • 🚀2-5A-2-EntityFrameworkEpisode2(第2篇)-FluentAPI、DataAnnotation(Click here)
  • 🚀2-5A-3-EntityFrameworkEpisode3(第3篇)-UnitOfWorkWithRepository(Click here)
  • 2-6B-Test(1to5)(.NetFramework)
  • 🚀2-6B-1-TestEpisode1(第1篇)-TestFramework(測試框架)-MSTest、NUnit(Click here)
  • 🚀2-6B-2-TestEpisode2(第2篇)-MockingFramework(隔離框架)-NSubstitute、Moq(Click here)
  • 🚀2-6B-3-TestEpisode3(第3篇)-UnitTest(單元測試)、IntegrationTest(整合測試)(Click here)
  • 🚀2-6B-4-TestEpisode4(第4篇)-FluentAssertionsPart1(Click here)
  • 🚀2-6B-5-TestEpisode5(第5篇)-FluentAssertionsPart2(Click here)
  • 2-7B-EF(4to6)(.NetFramework)PocoGenerator
  • 🚀2-7B-4-EntityFrameworkEpisode4(第4篇)-PocoGenerator(Click here)
  • 🚀2-7B-5-EntityFrameworkEpisode5(第5篇)-Test、UnitOfWorkWithRepositoryPart1(Click here)
  • 🚀2-7B-6-EntityFrameworkEpisode6(第6篇)-Test、UnitOfWorkWithRepositoryPart2(Click here)
  • 🚀2-8-Asp.NetMvcApi(.NetFramework)(VS2017)扎實打底(Click here)


.Net Framework Serious(學程) - Introduction

  • 🚀2-1-TSQL(.NetFramework)扎實打底(Click here)
  • TSQL全名是Transact-SQL,是一個專門用來存取Microsoft SQL Server裡面的Database(資料庫)的SQL語法。
  • 此課程討論Table、View、StoredProcedure和TableValueFunction四大Tsql物件。比較InnerJoin和DistinctInnerJoin和CrossApply和OuterApply,寫出更進階的Query。討論ConcurrentTransactions(2個同時進行的Process)所產生的DeadLock(死鎖),並找出BlockingProcess(被鎖的流程)。討論StringFunction。討論DateTime、DateTime2、SmallDateTime和DateTimeFunction。討論GetDateTime並比較Cast、Convert、Parse。討論RandomDateTime、EndOfMonth(EoMonth)、DateFromParts、DateTime2FromParts。討論MathFunction,包括Absolute(ABS絕對值)、Ceiling、Floor、Power(N次方)、RAND、SQUARE(平方)、SQRT(平方根)、ROUND。討論SequenceObject和IdentityProperty。比較Sub-Query和Join對大量Data的Performance。討論Index來改善Database Performance。討論StoredProcedures搭配DynamicSql來ReuseExecutionPlan進而改善DatabasePerformance。討論QuoteNameFunction來避免DynamicSql所產生的SqlInjection風險。
  • 🚀2-2-C#(.NetFramework)深入解析(Click here)
  • 早期程式語言只有C,後來發展出C++,Microsoft參考C、C++、Java...etc各種程式語言的觀念,開發出C#程式語言,#這個字是由4個+在上下左右所組成,意思是C++的++。C#是由Microsoft所開發的程式語言,它具備跨平台、物件導向的特性。能夠開發應用程式、Web Application、Mobile App。也是.Net Framework的必修課程。
  • 此課程討論C#的ObjectOriented(物件導向)、Interface、BaseClass、SubClass。討論Generic泛型。比較Array、Collection。比較GenericCollection(泛型集合)、NonGenericCollection。討論Reflection(反射)、讀取DLL。比較EarlyBinding、LateBinding。討論CustomAttribute(客製化屬性)、Reflection(反射)。討論PartialClass(部分類別)、PartialMethod(部分方法)。比較Indexer、Properties。比較Dictionary、List。討論DictionaryTKey、TValue、KeyValuePairTKey、TValue。討論List、SimpleType(簡單型別)、Sort。討論List、ReferenceType(參考型別)、Sort、Contains、Equals、SequenceEqual。比較Stack、Queue。討論FuncDelegate(委派)、LamdaExpression(表達式)、AnonymousMethod(匿名方法)。討論LamdaExpression(表達式)、AnonymousMethod(匿名方法)、RegisterEvent(註冊事件)。討論MultiThread(多執行緒)、DeadLock(死鎖定)、Mutex(互斥鎖)。比較Thread(執行緒)、Async、Await


  • 🚀2-3-Linq(.NetFramework)完全攻略(Click here)
  • LINQ的全名是Language Integrated Query,它是一個微軟新世代的查詢技術。讓開發者能能夠以統一的型態,來查詢各種類別的資料。Linq有兩種語法,一種是SQL Like Query,另一種是lambda Query。當我們把DataBase(資料庫)的Data(資料)讀取到C#的Collection之後,Linq可以將「搜尋條件」透過 「Where」語法從C#的Collection中找到特定的資料。
  • 討論兩種LinqQuery語法,分別為SQL Like Query和Lambda Query。討論LinqToObject將2個Collection透過LinqJoin來做查詢。討論GroupJoin、InnerJoin、LeftOutterJoin、CrossJoin。討論LinqToSql的CRUD(Create、Read、Update、Delete)。比較LinqToSql的LazyLoading、EagerLoading。討論LinqToXml的CRUD(Create、Read、Update、Delete)。討論LinqToXml的XmlToXml、XmlToHtml、XmlToCsv。討論LinqToXml的Validation,用Xsd來驗證XmlFormat。
  • 🚀2-4-Asp.NetMVC(.NetFramework)完全精通(Click here)
  • 我們通常使用Entity Framework或是Dapper或是ADO.NET來存取Microsoft SQL Server裡面的Database(資料庫)。當我們把DataBase(資料庫)的Data(資料)讀取到C#的Collection之後,Linq可以將「搜尋條件」透過 「Where」語法從C#的Collection中找到特定的資料。Asp.NetMVC(.NetFramework)可以把這些Data(資料)呈現在WebSite(網站)上。Asp.Net(.NetFramework)其實有兩種程式結構,一種是早期流行現在不流行的Web Form程式結構,另一種是現在流行的MVC程式結構,意思是Model、View、Controller。Asp.Net(.NetCore)只有MVC程式結構。學習Asp.NetMVC(.NetFramework)課程的門檻有點高,需要先了解一點TSQL、C#、Linq、HTML5、CSS3,才能來學習這門課程。此課程內容將從最基礎的Model、View、Controller基本觀念開始,討論Entity Framework、ADO.NET連接資料庫、ActionFilter、Cache、SSL、HTTPS、Certicate...etc各種實際工作上會用到的技術。從零開始實作一套帶有正常功能的「搜尋引擎」。
  • 討論IIS、RequireHttps、SSL、HTTPS、Certicate。討論MvcConventions(命名規則)。討論HtmlHelper的Label、Password、TextArea、Hidden、TextBox(For)、DropDownList(For)、(RadioButton,CheckBox,ListBox)List。討論EfDbFirst、DisplayImage(圖片顯示)、CustomHtmlHelpers、StronglyTypedViews、PartialView。討論TextArea的XSS(CrossSiteScripting)Attack(跨站腳本攻擊)。討論Layout、ViewStart、PartialView、LayoutNamedSections。討論類似GridView、SearchBar(搜尋引擎)、Pagging(分頁)、Sorting(排序)、DeleteMultipleRows(執行多筆移除)、SelectAll,UnSelectAll(全選,全不選)。討論OutputCacheAttribute(輸出快取屬性)的Duration、ChildAction、CustomCacheAttribute(自訂快取屬性)、VaryByParam、Location、ClearOutputCache(清除輸出快取)。討論Validation(驗證)、ResourceFile、WebConfigString、EmailFormatValidation(Email格式驗證)、EmailNotRegisteredValidation(驗證Email還沒被註冊)、JqueryUiDatePicker。讓使用者可以防呆,避免Bad Data(不良數據)進入資料庫。討論Cdn、Ajax、JqueryUi、AutoComplete。
  • 2-5A-EF(1to3)(.NetFramework)
  • 🚀2-5A-1-EntityFrameworkEpisode1(第1篇)-CodeFirst、DBFirst(Click here)
  • 通常使用Entity Framework來存取Microsoft SQL Server裡面的Database(資料庫)。當DataBase(資料庫)的Data(資料)讀取到C#的Collection之後,Linq可以將「搜尋條件」透過 「Where」語法從C#的Collection中找到特定的資料。然後Asp.NetMVC可以把這些Data(資料)呈現在WebSite(網站)上。此課程會深入討論Entity Framework的EfCodeFirst、EfDbFirst開發模式。
  • 討論TablePerHierarchyInheritance(TPH),1個Table對應到1個Entity和2個SubEntity。討論TablePerTypeInheritance(TPT),3Tables對應到1Entity2SubEntities。討論ManyToMany、ManyToManyWithBridgeTable,使用StoredProcedure做CRUD (Create、Read、Update、Delete)。討論Database的Table的某個Column會對應到EF中的Enum型別。
  • 🚀2-5A-2-EntityFrameworkEpisode2(第2篇)-FluentAPI、DataAnnotation(Click here)
  • 此課程會深入「EfCodeFirst-Migration」子開發模式下,有關「Relationship」的語法,分為「DataAnnotations」語法和「FluentAPI」語法。
  • 討論EfCodeFirst的Migration子開發模式搭配DataAnnotations語法。討論InitExistingDatabase、AddTable、DeleteTable、AddColumn、DeleteColumn、DowngradeDatabase、UpgradeDatabase。使用DataAnnotations來OverridingCodeFirstConventions。比較DataAnnotatios、FluentApi。討論TablePerHierarchy(TPH)Inheritance,比較DataAnnotation、FluentApi。討論TablePerType(TPT)Inheritance,比較DataAnnotation、FluentApi。討論FluentApi語法實作TablePerConcreteType(TPC)Inheritance。討論Ef連接到StoredProcedure。討論AutoMapper。
  • 🚀2-5A-3-EntityFrameworkEpisode3(第3篇)-UnitOfWorkWithRepository(Click here)
  • 本課程會討論EfCodeFirst、EfDbFirst的Rpository、UnitOfWork、AutoMapper、MSTest。在Database建立前,使用MockUpData建立MVC。
  • 傳統的開發模式,都是DatabaseAdministrator(DBA)先開發Database。接下來Programmer(PG)才可以去開發UserInterface(UI),UI可以是Asp . Net MVC( . NetFramework)。Rpository、UnitOfWork層隔開了DataAccess層和UserInterface(UI)層。這有什麼好處?
  • 第一個好處,Rpository、UnitOfWork層可以讓DatabaseAdministrator(DBA)和Programmer(PG)同時開工,不浪費時間。在Database建立前,先建立Rpository、UnitOfWork層。使用AutoMapper來把EfModel對應到MvcModel。使用MSTest、MockUpData(假資料)去測試Rpository、UnitOfWork層。Rpository、UnitOfWork層有點像是一個合約,建立好Rpository、UnitOfWork層之後,DatabaseAdministrator(DBA)就可以理解要放進什麼Data進Rpository、UnitOfWork層,進而去開發Database。同時,Programmer(PG)就可以理解Rpository、UnitOfWork層可以吐出什麼Data,在Database建立好前,Programmer(PG)可以使用MockUpData(假資料)進而去開發UserInterface(UI),UI可以是Asp . Net MVC( . NetFramework)。
  • 第二個好處,歷年來,每隔幾年,微軟就會推新的連接資料庫的方法,舉例來說,早期,DataAccess層通常為ADO . NET,而UserInterface(UI)層通常為Asp . Net WebForm。但是現在DataAccess層通常為EF,而UserInterface(UI)層通常為Asp . Net MVC。如果早期就有寫Rpository、UnitOfWork層去隔開DataAccess層和UserInterface(UI)層,那麼,DataAccess層從ADO . NET升級為EF就會變得非常容易。而UserInterface(UI)層從Asp . Net WebForm升級為Asp . Net MVC也會非常容易。
  • 參考微軟官網的範例文件(Click here)。
  • 2-6B-Test(1to5)(.NetFramework)
  • 🚀2-6B-1-TestEpisode1(第1篇)-TestFramework(測試框架)-MSTest、NUnit(Click here)
  • 用來寫UnitTest(單元測試)的比較流行的TestFrameworks(測試框架)有MSTest、xUnit、NUnit、Gallio、MBUnit、MSpec、NSpec、FluentAssertion...etc。MSTest是一定要學的,因為MSTest是VisualStudio內建的。剩下的TestFramework(測試框架)都是要安裝ThirdPartyTool(第三方工具)才能執行的,NUnit、FluentAssertion是其中比較流行的。此課程會深入兩個TestFramework(測試框架),MSTest、NUnit。
  • 一開始用MSTest、NUnit討論Arrange、Act、Assert(AAA)觀念。接著討論MSTest、NUnit的TestContext.WriteLine、System.Diagnostics.Debug.WriteLine。然後討論MSTest和NUnit測試SqlServerDatabase、Csv、Xml。深入討論MSTest、NUnit的Assert。淺嘗則止地討論TestDrivenDevelopment(TDD)的Red、Green、Refactor,討論TDD的Facking、Red、Green、TriangulationRefactor、ObviousImplementation。
  • 🚀2-6B-2-TestEpisode2(第2篇)-MockingFramework(隔離框架)-NSubstitute、Moq(Click here)
  • 假設你要測試ClassA,但是ClassA裡面有使用ClassB。
  • Integration Test(整合測試)的觀念是多個小單位一起測試。一個範例就是測試ClassA的時候,也一起測試一點點的ClassB。
  • Unit Test(單元測試)的觀念是只測試最小單位。假設我們的最小單位是ClassA,我們只想測試ClassA,不想連帶著測試ClassB。所以在Unit Test(單元測試)的時候,我們必須要製作一個Test Double(模擬物件)來替換掉ClassB,當我們測試ClassA的時候,就不會碰到ClassB。
  • TestDouble(模擬物件)可以分為Dummy、Stub、Spy、Mock、Fake。
  • 比較流行的Mocking Framework(隔離框架)有Moq、NSubstitute、Rhino Mocks、FakeItEasy、NMock3...etc,專門用來動態生成Test Double(模擬物件)。此課程就會深入討論兩個最流行的Mocking Framework(隔離框架),深入討論Moq、NSubstitute的觀念和寫法。
  • 最後,深入討論IComparable<T>、IComparable。IComparer、IComparer<T>。IEqualityComparer<T>。
  • 🚀2-6B-3-TestEpisode3(第3篇)-UnitTest(單元測試)、IntegrationTest(整合測試)(Click here)
  • 此課程會深入討論Integration Test(整合測試)和Unit Test(單元測試)。
  • 一開始討論DbContext、EfModel。接著討論EfModelRepository、EfModelUnitOfWork。然後討論Fake、Comparer。重頭戲來了,用NUnit、MSTest做UnitTest(單元測試)、IntegrationTest(整合測試)。最後,討論MockingFramework(隔離框架)的Moq、NSubstitute。
  • 高的Code Coverage(代碼覆蓋率)不等於High quality test suite(高品質的自動化測試),但是太低的Code Coverage(代碼覆蓋率)肯定代表你寫的自動化測試的品質不夠。此課程會用最直白實用的範例,透過合理的Code Coverage(代碼覆蓋率)觀念來抓住寫自動化測試的感覺,讓您有效率的測試自己所撰寫的程式碼。
  • 🚀2-6B-4-TestEpisode4(第4篇)-FluentAssertionsPart1(Click here)
  • 🚀2-6B-5-TestEpisode5(第5篇)-FluentAssertionsPart2(Click here)
  • 用來寫UnitTest(單元測試)的比較流行的TestFrameworks(測試框架)有MSTest、xUnit、NUnit、Gallio、MBUnit、MSpec、NSpec、FluentAssertion...etc。MSTest是一定要學的,因為MSTest是VisualStudio內建的。剩下的TestFramework(測試框架)都是要安裝ThirdPartyTool(第三方工具)才能執行的,NUnit、FluentAssertion是其中比較流行的。每一家公司所使用的TestFramework(測試框架)可能都不一樣,難道我們要去學每一個TestFramework(測試框架)嗎?當然不必,我們只需要學會FluentAssertion就可以了。因為FluentAssertion語法可以用在MSTest、xUnit、NUnit、Gallio、MBUnit、MSpec、NSpec這些環境底下,也可以用在.NET Core 、.NET standard和.NET Framework的環境,並且讓Failure Message(失敗訊息)和Test Source code(測試原始碼)更有可讀性。
  • E.g.1.
  • int sampleValue = 1;
  • int expectValue = 2;
  • Assert.AreEqual(expectValue, sampleValue); //MSTest&NUnit
  • //Message: Expected: 2 ; But was: 1
  • E.g.2.
  • Assert.That(sampleValue, Is.EqualTo(expectValue)); //NUnit
  • //Message: Expected: 2 ; But was: 1
  • E.g.3.
  • sampleValue.Should().Be(expectValue); //FluentAssertions
  • //Message: Expected sampleValue to be 2, but found 1.
  • 更多FluentAssertions的用法請參考官網(https://fluentassertions.com/)
  • 【TestEpisode4(第4篇)-FluentAssertionsPart1】專注於使用FluentAssertions測試SimpleType、單一個Object。
  • 討論FluentAssertion的AssertionScope、StartsWith、EndsWith、Contains、(DoesNot)Matches。討論FluentAssertions測試Number包括Int、Decimal、Double、Float、Byte。討論FluentAssertions測試DateTime、Type、Method、Property、Assembly、Acton、Thread、Task、Type, Nullable, Boolean、Guid、Enum。討論NUnit、MSTest、FluentAssertions測試String。
  • 【TestEpisode5(第5篇)-FluentAssertionsPart2】專注於使用FluentAssertions測試Collection、Dictionary。
  • 討論FluentAssertions測試Int的Collection和試Int、String的Dictionary。接著討論MSTest、NUnit、FluentAssertions測試StringCollection、ObjectCollection、Xml的資料、Event、Exception
  • 第一個重點,假設Gamer、Power這兩個Class內含有Equal、Compare邏輯,用MSTest、NUnit、FluentAssertions測試(Int或String)、Power的Dictionary。
  • 第二個重點,假設Gamer、Power的Equal、Compare邏輯在別的Class,用MSTest、NUnit、FluentAssertions測試(Int或String)、Power的Dictionary。
  • 2-7B-EF(4to6)(.NetFramework)PocoGenerator
  • 🚀2-7B-4-EntityFrameworkEpisode4(第4篇)-PocoGenerator(Click here)
  • 「EntityFramework Reverse POCO Generator」是一個付費的「VisualStudioExtension」。微軟官方提供的「ScaffoldDbContext」指令只能連接「Database」的Table、View。當Database(資料庫)異動的時候,使用「ScaffoldDbContext」來重新產生「EfCore」程式碼也非常不實用。「EntityFramework Reverse POCO Generator」可以連接Database(資料庫)的Table、View、StoredProcedure、TableValueFunction,比微軟官方提供的「ScaffoldDbContext」指令實用太多了。
  • 討論EfPocoGenerator產生的EF程式碼分散到多個Folder(資料夾)、Project。討論EfPocoGenerator的設定、Filtering,假設現有Database有上百個Table,而你的EF程式碼只需要針對其中10個Table去做CRUD。
  • 🚀2-7B-5-EntityFrameworkEpisode5(第5篇)-Test、UnitOfWorkWithRepositoryPart1(Click here)
  • 🚀2-7B-6-EntityFrameworkEpisode6(第6篇)-Test、UnitOfWorkWithRepositoryPart2(Click here)
  • 「EntityFrameworkEpisode5~6(第5~6篇)」整合我們目前所學技術包括 TSQL、C#、Linq、NUnit、MSTest、HTML5 CSS3、Asp.Net MVC、Entity Framework、UnitOfWorkWithRepository,手寫出一個完整的範例。
  • 「EntityFrameworkEpisode5(第5篇)」重點在於把Database(資料庫)的Table(資料表)、View、StoredProcedure、TableValuedFunction連到EntityFramework,再連到EfModelRepository層的EfModelRepository、EfModelUnitOfWork。
  • 「EntityFrameworkEpisode6(第6篇)」重點在於使用AutoMapper把EfModelRepository層的EfModelRepository、EfModelUnitOfWork連到UiModelRepository層的UiModelRepository、UiModelUnitOfWork,再連到Ui層的Asp.NetMVC的Model、View、Controller。尤其是,Database(資料庫)的Weapon(武器)Table(資料表)建立前,在UiModelRepository層的WeaponRepository使用MockUpData(假資料)建立Ui層Asp.NetMVC。
  • 🚀2-8-Asp.NetMvcApi(.NetFramework)(VS2017)扎實打底(Click here)
  • 早期FrontEnd(前端)技術只有Javascript和Jquery,並且BackEnd(後端)和FrontEnd(前端)幾乎是密不可分的。後來「API」技術成熟後,「API」把BackEnd(後端)和FrontEnd(前端)分割出來各自發展。所以FrontEnd(前端)技術後來又發展出TypeScript、Angular和ES6、React和Vue。「API」就像是一個溝通用的合約,告訴BackEnd(後端)需要提供什麼資料出來,告訴FrontEnd(前端)有什麼資料可以用,只要雙方都符合合約內容,就可以合作順利。
  • FrontEnd(前端)會提供一個特定的URL和一個特定的HTTP Verb給「API」。「API」會透過URL去判斷要呼叫BackEnd(後端)哪一個method。HTTP Verb有四個,Post會CreateData(新增資料),Get會ReadData(讀取資料), Put會UpdateData(更新資料),Delete會DeleteData(刪除資料),也就是「API」會透過HTTP Verb去判斷要呼叫後端的CRUD中的哪一個。
  • 「API」就像是「餐廳櫃台」,BackEnd(後端)就像是廚房裡的「廚師」,Database(資料庫)就像是廚房裡的「冰箱」,Data(資料)就像是廚房裡的「食材」,FrontEnd(前端)就像是「前台服務生」,User(使用者)就像是「來吃飯的客人」。
  • 當「API」(餐廳櫃台)收到特定的URL和一個特定的HTTP Verb,「API」(餐廳櫃台)就會跟BackEnd(後端) 「廚師」說:『你看,我們客人點了這些餐點』。BackEnd(後端) 「廚師」就去Database(資料庫)「冰箱」裡面拿出特定的Data(資料)「食材」,加入特定的商業邏輯計算(加油加蒜頭加辣炒一炒),然後BackEnd(後端) 「廚師」 就把已經加工過後的Data(資料)(煮好的餐點)放到「API」(餐廳櫃台),FrontEnd(前端)「前台服務生」從「API」(餐廳櫃台)拿到這些Data(資料)(煮好的餐點),送去給User(使用者)「來吃飯的客人」。
  • E.g. 1.
  • URL: /Gamers
  • HTTP verb: GET
  • Gets a list of gamers(讀取所有Gamer的資料)
  • E.g. 2.
  • URL: /Gamer/1
  • HTTP verb: GET
  • Gets the gamer with Id = 1(讀取ID為1的Gamer資料)
  • E.g. 3.
  • URL: /Gamers
  • HTTP verb: POST
  • Create a new gamer to the list of gamers(新增一個Gamer到GamerList)
  • E.g. 4.
  • URL: /Gamer/1
  • HTTP verb: PUT
  • Update the gamer with Id = 1(更新ID為1的Gamer資料)
  • E.g. 5.
  • URL: /Gamer/1
  • HTTP verb: DELETE
  • Delete the gamer with Id = 1(刪除ID為1的Gamer資料)

.Net Core and .Net Framework

To understand .NET Core and .NET Framework, it's important to first know the history of .NET. Initially, C# was used in the .NET Framework Library for Windows software development. When you install Windows 7, 8, 10, 11, etc., the corresponding .NET Framework version is also installed. Microsoft later developed the .NET Core Library for cross-platform development, allowing engineers to use C# to write software that can be executed on multiple platforms, including Windows, Linux, and Mac. For cross-platform mobile app development, Microsoft created Xamarin and .NET MAUI, which can convert C# code into executable apps for various mobile platforms such as iPhone, Android, and Windows Phone.

Let's introduce Web Applications, which can be accessed via a web browser such as Microsoft Edge, Google Chrome, and Firefox. Users don't need to install any special software, as long as they have a browser, they can use web applications. Web applications are mainly used for user interface (UI) development and can be quickly learned by users with internet experience.

Under the .NET Framework Library, there are two types of web applications: ASP.NET WebForm and ASP.NET MVC. In the early days, ASP.NET WebForm was the only structure available, with the file extension aspx. Later, the mainstream became ASP.NET MVC, which stands for Model, View, and Controller. Under the .NET Core Library, only the ASP.NET MVC structure is available. Therefore, if you are a novice, it is best to directly learn the current mainstream ASP.NET MVC structure.

To summarize, the .NET Framework Library is used for developing Windows operating system software, while the .NET Core Library is used for cross-platform development. Xamarin and .NET MAUI enables writing apps for mobile platforms using C#. Therefore, to become a .NET engineer, proficiency in the C# programming language is essential.

.Net Core和.Net Framework

在講. Net Core和. Net Framework之前,要先了解. Net的歷史。早期工程師在開發Windows軟體,都是使用. Net Framework Library中的C#程式語言。所以當你安裝Windows 7、8、10、11...etc的時候,其實也會內建安裝相對應的. Net Framework版本。後來,Microsoft為了跨(統一)平台(世界)發展了. Net Core Library,只要軟體工程師乖乖使用. Net Core Library中的C#程式語言寫軟體,那麼你就可以把同一份程式碼轉成各個平台可以執行的軟體,這些平台包括Windows、Linux、Mac。Microsoft為了跨(統一)手機平台(世界),也發展了Xamarin,.NET MAUI允許軟體工程師使用C#來寫APP,然後Xamarin,.NET MAUI就可以把你寫的同一份程式碼轉成各個手機平台可以執行的APP,這些平台包括Iphone、Android、Windows Phone。

接下來我來介紹Web Application,就是一個可以用瀏覽器Browser(瀏覽器)來操作的應用程式,Browser(瀏覽器)可以是MicrosoftEdge、GoogleChrome、FireFox...etc。簡單來說,使用者不需要安裝特殊軟體,只要有MicrosoftEdge,就可以使用Web Application。通常Web Application是拿來開發User Interface(UI)(使用者介面),只要有上網經驗的User(使用者)都可以很快上手。

Web Application在. Net Framework Library技術底下又分兩種,早期只有ASP. Net WebForm結構,副檔名是aspx。後來,主流變成另一個Asp. Net MVC結構,MVC就是Model、View、Controller。Web Application在. Net Core Library技術底下,只有Asp. Net MVC結構。所以,如果你是新手,請直接學習目前主流的Asp. Net MVC結構。

我做一個簡單的總結。. NET Framework Library是用來寫Windows作業系統的軟體。. NET Core Library是用來寫跨平台的軟體。Xamarin, .NET MAUI是用來寫跨手機平台的App。而我們所使用的程式語言就是C#。所以想成為. NET工程師,C#程式語言必學!!

EntityFramework(.NetFramework)(1to6)學程簡介

連接資料庫,一直是屬於後端最重要的一環。「.NET」技術連接資料庫其實有多種技術。舉例來說,常見的有「ADO.NET、LinqToSql、Dapper、EntityFramework。最近幾年最流行的就是「EntityFramework」。

EntityFramework (.Net Framework)」其實有多種開發模式。常見的有「EfDbFirst」開發模式和「EfCodeFirst」開發模式。但是,「EntityFramework (.Net Core)不能執行「EfDbFirst」開發模式,只能執行「EfCodeFirst」開發模式。EfCodeFirst」開發模式底下,又分為兩種子開發模式。分別為「EfCodeFirst-ReverseEngineering」子開發模式和「EfCodeFirst-Migration」子開發模式。我個人會建議使用「EfCodeFirst-ReverseEngineering」子開發模式。在「EfCodeFirst」開發模式底下,有關「Relationship」的語法,又分為「DataAnnotations」語法和「FluentAPI」語法。結論就是,我個人偏好於使用「EfCodeFirst-ReverseEngineering」子開發模式搭配「EfCodeFirst-FluentAPI」語法。

「EntityFramework( . Net Framework)」的 「EfDbFirst」開發模式是什麼?

  • EfDbFirst」就是先透過「TSQL」開發「Database」,然後透過「VisualStudio」的一些精靈自動生成一個副檔名為「EDMX」的「XML」格式的檔案。透過該「EDMX」檔案會自動生成相對應的「EntityFramework( . Net Framework)」程式碼,自動生成包括各種「EfModel」和「DbContext」。我們透過「Linq」語法來操作資料。在「UserInterface」那邊可以讓「User」執行「CRUD」。「UserInterface」可以是「ConsoleApp」也可以是「Asp.Net MVC (.Net Framework)」。

「EntityFramework( . Net Framework)」和 「EntityFramework( . Net Core)」的 「EfCodeFirst」開發模式是什麼?

  • EfCodeFirst」開發模式可以用在「EntityFramework (.Net Framework)」和 「EntityFramework (.Net Core)」。EfCodeFirst」開發模式底下,又分為兩種子開發模式。分別為「EfCodeFirst-ReverseEngineering」子開發模式和「EfCodeFirst-Migration」子開發模式。

「EfCodeFirst」開發模式底下的「EfCodeFirst-Migration」子開發模式是什麼?

  • EfCodeFirst-Migration」子開發模式其實就是在開發DatabaseTable」之前,手寫每一個DatabaseTable相對應的EfModel和一個DbContext。然後在VisualStudio執行一些Migration指令並且產生出MigrationClass
  • 每個MigrationClass就類似一個GitCommitMigrationClass裡面有up()Methoddown()Methodup()Method可以UpgradeDatabasedown()Method可以DowngradeDatabaseMigrationClass可以讓達到「DatabaseSourceControl的目的。
  • 但是,實際上,很多公司的「DatabaseAdministrator」都不允許「Programmer」使用「EfCodeFirst-Migration」子開發模式來開發「Database」,所以其實「EfCodeFirst-Migration」子開發模式並不實用。

「EfCodeFirst」開發模式底下的「EfCodeFirst-ReverseEngineering」子開發模式是什麼?和「EfDbFirst」開發模式差別在哪?

  • EfCodeFirst-ReverseEngineering」子開發模式很類似「EfDbFirst」開發模式,都先開發「Database」,差別在於資料庫異動之後的作法。另外一個差異在於,「EfDbFirst」開發模式只能產生「EntityFramework( . Net Framework)」程式碼,而「EfCodeFirst-ReverseEngineering」子開發模式可以產生「EntityFramework( . Net Framework)」程式碼或是「EntityFramework( . Net Core)」程式碼。
  • EfDbFirst」開發模式使用「VisualStudio的一些精靈自動生成一個副檔名為EDMXXML格式的檔案。透過該EDMX檔案會自動生成相對應的EntityFramework( . Net Framework)程式碼,自動生成包括各種EfModelDbContext。當資料庫異動的時候,我們需要更新EDMX檔案。我們不能直接修改自動產生的EntityFramework( . Net Framework)程式碼。
  • EfCodeFirst-ReverseEngineering」子開發模式使用某一個「VisualStudioExtension執行ReverseEngineering技術,自動生成相對應的「EntityFramework( . Net Framework)」程式碼或是「EntityFramework( . Net Core)」程式碼。當資料庫異動的時候,我們可以直接修改EF」程式碼。但是,我推薦直接修改「EF」程式碼。我建議更新VisualStudioExtension的設定去執行ReverseEngineering技術,自動生成相對應的「EF程式碼。
  • EF Core Power Tools」是一個免費的「VisualStudioExtension」。(https://marketplace.visualstudio.com/items?itemName=ErikEJ.EFCorePowerTools)
  • EntityFramework Reverse POCO Generator」是一個付費的「VisualStudioExtension」。
  • 微軟官方提供的「ScaffoldDbContext」指令只能連接「Database」的「Table」和「View」。當資料庫異動的時候,使用「ScaffoldDbContext」來重新產生「EfCore」程式碼也非常不實用。
  • EntityFramework Reverse POCO Generator」和「EF Core Power Tools」都可以連接「Database」的TableViewStoredProcedureTableValueFunction。請從這兩個「VisualStudioExtension」選一個來執行「EfCodeFirst-ReverseEngineering」子開發模式。它們比微軟官方提供的「ScaffoldDbContext」指令實用太多了。

在「EfCodeFirst」開發模式底下,有關「Relationship」的語法,又分為「EfCodeFirst-DataAnnotations」語法和「EfCodeFirst-FluentAPI」語法。差別在哪?

  • EfCodeFirst-DataAnnotations」語法其實和「EfDbFirst」開發模式一樣可以實作5種「Relationship」,包括OneToOneOrManyOneToZeroOrManyManyToManyWithMiddleEfModelManyToManyWithoutMiddleEfModelOneToZeroOrOne。但是,「EfCodeFirst-FluentAPI」語法不只可以實作上面5Relationship,還可以多實作1Relationship,就是MandatoryOneToOne(強制OneToOne)。結論就是,「EfCodeFirst-FluentAPI」語法是比較好的。

「OneToZeroOrOne」和「MandatoryOneToOne 」(強制OneToOne)這2種「RelationShip 」差別在哪?

  • 舉例來說,假設「Gamer」Table有「ID和「Name,「GamerDetailTable有「ID和「Level
  • OneToZeroOrOne」的意思是「Gamer」可以有或可以沒有「GamerDetail」。EfDbFirst」開發模式和「EfCodeFirst-DataAnnotations」語法和「EfCodeFirst-FluentAPI」語法都可以實作「OneToZeroOrOne
  • MandatoryOneToOne」(強制OneToOne)的意思是「Gamer一定要有「GamerDetail」。只有「EfCodeFirst-FluentAPI」語法才能實作「MandatoryOneToOne」(強制OneToOne)
  • 結論就是,我個人偏好於使用「EfCodeFirst-ReverseEngineering」子開發模式搭配「EfCodeFirst-FluentAPI」語法。

要如何學習「EntityFramework」?怎樣才算完全了解「EntityFramework」?

  • 我推薦先開發「Database」。我推薦先在「FakeSolution」使用「EntityFramework Reverse POCO Generator」或「EF Core Power Tools」去產生「EfCore」程式碼,並且好好研究這些自動產生的「EfCore」程式碼。如果你可以自己寫「EfCore」程式碼來連接「Database」的TableViewStoredProcedureTableValueFunction,而無需在「RealSolution」使用任何的「VisualStudioExtension」,那麼你就算完全了解「EntityFramework」。

PS: 此學程只教「EntityFramework(. Net Framework)」,不教「EntityFramework(. Net Core)

結論,

  • 【EntityFrameworkEpisode1(第1篇)-CodeFirst、DBFirst】和【EntityFrameworkEpisode2(第2篇)-FluentAPI、DataAnnotation】一定要詳細學習,剩下的課程只是井上添花,沒時間可以跳過。
  • EntityFrameworkEpisode2(第2篇)-FluentAPI、DataAnnotation】將會詳細討論「EfCodeFirst-Migration」子開發模式和「EfCodeFirst-ReverseEngineering」子開發模式。也會詳細討論「EfCodeFirst-DataAnnotations」語法和「EfCodeFirst-FluentAPI」語法
  • 【EntityFrameworkEpisode3(第3篇)-UnitOfWorkWithRepository】只是閹割版本的【EntityFrameworkEpisode5(第5~6篇)-Test、UnitOfWorkWithRepository】,如果時間不夠,可以跳過。
  • 【EntityFrameworkEpisode4(第4篇)-PocoGenerator】會詳細討論EntityFramework Reverse POCO GeneratorEntityFramework Reverse POCO Generator」完全符合「EfCodeFirst-ReverseEngineering子開發模式搭配EfCodeFirst-FluentAPI語法的需求。EntityFramework Reverse POCO Generator產生出來的EF程式碼可以無縫接軌Database的Table、View、TableValueFunction、Stored Procedure。
  • 【EntityFrameworkEpisode5(第5~6篇)-Test、UnitOfWorkWithRepository】會使用EntityFramework Reverse POCO GeneratorFakeProject(假專案)來自動產生EF程式碼,詳細研究EntityFramework Reverse POCO Generator所產生出來的程式碼,並且只擷取我們需要的部分複製到RealPorject(真實專案)。在RealPorject(真實專案)實作UnitOfWorkRepository,並實作如何做自動化測試Test。【EntityFrameworkEpisode5(第5篇)-Test、UnitOfWorkWithRepositoryPart1】專注於從Database連到EntityFramework並連結到UnitOfWork和Repository。【EntityFrameworkEpisode6(第6篇)-Test、UnitOfWorkWithRepositoryPart2】專注於把UnitOfWork和Repository透過AutoMapper連接到Asp . Net MVC (. Net Framework)。實作SearchBar(搜尋欄)和AutoComplete(自動完成)和Sorting(排序)和Paging(分頁),Caching(快取),還有DeleteMultiple(刪除多筆資料)等各種 MVC精華重點。

Test(1to5)(.NetFramework)學程簡介

假設你發現一年前所寫的程式碼有Bug。你必須要先花時間去思考一年前的程式碼邏輯,然後才能花時間去debug。但是如果你一年前就寫了「AutomatedTest」(自動化測試),並且在你寫完程式碼的時候馬上執行「AutomatedTest」,你就可以馬上發現這個Bug。在你還沒有忘記程式碼的邏輯的時候,你就可以直接Debug,可以節省不少時間。自己寫的程式碼,自己最了解。所以軟體工程師必須要有能力寫「AutomatedTest」(自動化測試)來測試自己的程式碼。「AutomatedTest」(自動化測試)比「ManualTesting」(人工測試)更可靠,更節省時間。「AutomatedTest」(自動化測試)可以讓你的程式碼更有生產力,節省更多維護程式碼的成本

AutomatedTest」(自動化測試)大致上可以分成三種,以比例高到低排序,分別為UnitTest(單元測試)、IntegrationTest(整合測試)、EndToEndTest(端對端測試)

  • UnitTest」(單元測試)是用來測試「MinimumUnit」(最小單位),「最小單位」可以是一個「Method」或是一個「Class因為「UnitTest」(單元測試)測試的範圍最小,所以「UnitTest」的執行速度是最快的。因此,我們應該要盡量多寫一點「UnitTest」(單元測試)。「UnitTest」(單元測試)也是三種「AutomatedTest」(自動化測試)中最重要的。有很多種「DesignPattern」。「OOP、FP、SOLID」是目前比較流行的「DesignPattern」。不管你用哪一種「DesignPattern」,都是可以寫「UnitTest」。在2023年,最流行的「DesignPattern」是「SOLID」。如果你的程式碼越符合「SOLID」這種「DesignPattern」,那麼「UnitTest」就會越容易寫。
  • IntegrationTest」(整合測試)是以多個「Method」或是多個「Class」或是多個「Project」為一個單位去做測試。舉例來說,「DataAccessLayer」是一個「Project」,「BusinessLayer」是另外一個會和「DataAccessLayer」互動的「Project」。我們應該使用「IntegrationTest」測試這兩個「Project」之間的互動是否會出問題。因為「IntegrationTest」測試的範圍比「UnitTest」的測試範圍大一點,所以「IntegrationTest」的執行速度比「UnitTest」慢一點。因此我們應該要少寫一點「IntegrationTest」,但是多寫一點「UnitTest
  • EndToEndTest」(端對端測試)是從「User」的角度去做測試,所以「EndToEndTest」通常會連接一個「FakeDatabase」去測試整個「Solution」。如果「Solution」通過UnitTest、IntegrationTest、EndToEndTest,這個「Solution」才可以去連接「RealDatabase」,才能正式上線。我們通常會用Selenium來寫EndToEndTest (http://Seleniumhq.org因為「EndToEndTest」測試的範圍比「IntegrationTest」的測試範圍大一點,所以「EndToEndTest」的執行速度比「IntegrationTest」慢一點。因此我們應該要少寫一點IntegrationTest、EndToEndTest,但是多寫一點「UnitTest

用來寫「UnitTest」(單元測試)的比較流行的「TestFrameworks」(測試框架)有MSTest、xUnit、NUnit、Gallio、MBUnit、MSpec、NSpec、FluentAssertion...etcMSTest是一定要學的,因為MSTestVisualStudio內建的。剩下的「TestFramework」(測試框架)都是要安裝「ThirdPartyTool」才能執行的,NUnit、FluentAssertion是其中比較流行的。每一家公司所使用的「TestFramework」可能都不一樣,難道我們要去學每一個「TestFramework」嗎?當然不必,我們只需要學會「FluentAssertion」就可以了。因為「FluentAssertion」語法可以用在MSTest、xUnit、NUnit、Gallio、MBUnit、MSpec、NSpec這些環境底下

為什麼我們需要用「TestDouble」(假物件)來代替「ProductionObject」來寫「UnitTest」(單元測試)呢?

舉例來說,我們想要測試「ClassA」,但是「ClassA」會用到「ClassB」。如果我們寫的是「IntegrationTest」(整合測試),那我們可以測試「ClassA」的時候,順便測試「ClassA」和「ClassB」的互動關係。如果我們寫的是「UnitTest」(單元測試),我們只想單獨測試「ClassA」,不想測試「ClassB」。這時候,我們需要用「TestDouble」(假物件)來代替「ClassB」去寫「UnitTest」來測試「ClassA」。換句換說,TestDouble」可以隔離「ClassB」的「Dependency」(相依性),讓「UnitTest」可以只測試「ClassA

每個流派對「TestDouble」的定義都不太一樣,我讀了不少文件後,我建議「TestDouble」按照低到高的排序可分為「Dummy、Stub、Spy、Mock、Fake」。用來動態生成「TestDouble」的比較流行的「MockingFramework」有Moq、Nsubstitute、FakeItEasy、RhinoMocks...etc。每個「MockingFramework」都是要安裝「ThirdPartyTool」才能執行的,Moq、Nsubstitute是其中比較流行的

PS: 此學程只教「. Net Framework)」,不教「. Net Core

結論,

  • 用來寫「UnitTest」(單元測試)的比較流行的「TestFrameworks」(測試框架)有MSTest、xUnit、NUnit、Gallio、MBUnit、MSpec、NSpec、FluentAssertion...etcMSTest是一定要學的,因為MSTestVisualStudio內建的。剩下的「TestFramework」(測試框架)都是要安裝「ThirdPartyTool」才能執行的,NUnit、FluentAssertion是其中比較流行的。【TestEpisode1(第1篇)-TestFramework(測試框架)-MSTest、NUnit】會深入討論MSTest、NUnit。
  • 舉例來說,我們想要測試「ClassA」,但是「ClassA」會用到「ClassB」。「TestDouble」可以隔離「ClassB」的「Dependency」(相依性),讓「UnitTest」可以只測試「ClassA」。每個流派對「TestDouble」的定義都不太一樣,我讀了不少文件後,我建議「TestDouble」按照低到高的排序可分為「Dummy、Stub、Spy、Mock、Fake」。用來動態生成「TestDouble」的比較流行的「MockingFramework」有Moq、Nsubstitute、FakeItEasy、RhinoMocks...etc。每個「MockingFramework」都是要安裝「ThirdPartyTool」才能執行的,Moq、Nsubstitute是其中比較流行的。【TestEpisode2(第2篇)-MockingFramework(隔離框架)-NSubstitute、Moq】會深入討論「Dummy、Stub、Spy、Mock、Fake」這些「TestDouble」的觀念。也會深入討論Moq、Nsubstitute這兩個用來動態生成「TestDouble」的「MockingFramework
  • 每一家公司所使用的「TestFramework」可能都不一樣,難道我們要去學每一個「TestFramework」嗎?當然不必,我們只需要學會「FluentAssertion"就可以了。因為「FluentAssertion」語法可以用在MSTest、xUnit、NUnit、Gallio、MBUnit、MSpec、NSpec這些環境底下。【TestEpisode4(第4篇)-FluentAssertionsPart1】和【TestEpisode5(第5篇)-FluentAssertionsPart2】會深入討論「FluentAssertion」語法。
  • 用來寫「UnitTest」(單元測試)的比較流行的「TestFrameworks」(測試框架)有MSTest、xUnit、NUnit、Gallio、MBUnit、MSpec、NSpec、FluentAssertion...etcMSTest是一定要學的,因為MSTestVisualStudio內建的。剩下的「TestFramework」(測試框架)都是要安裝「ThirdPartyTool」才能執行的,NUnit、FluentAssertion是其中比較流行的。
  • 【TestEpisode3(第3篇)-UnitTest(單元測試)、IntegrationTest(整合測試)】使用UnitOfWork、Repository範例來討論UnitTest(單元測試)、IntegrationTest(整合測試)。其實,這是閹割版的【EntityFrameworkEpisode5(第5~6篇)-Test、UnitOfWorkWithRepository】。如果你想跳過也可以。