使用依賴注入組織 ASP.Net MVC 解決方案的最佳方法是什麼?
我正在開發一個新的 ASP.Net MVC 項目,我正在使用這個項目進入 DI。我很確定我將使用結構圖,但這不是我要問的。我想弄清楚的是如何最好地組織我的解決方案。單元測試項目和模型是否都獲得了一個配置文件來映射它們的依賴關係,或者是否有一個類來統治它們?
另外,在我深入這個之前,是否有任何新手陷阱需要避免?
非常感謝,所有……
更新 我應該補充一點,當我說“組織解決方案”時,我指的不是文件/文件夾的數量等,而是如何構造與 DI 相關的類。特別是如何管理引導程序。我可以看到我糟糕的措辭可能會導致混亂。
鼓勵更好的 TDD。有兩個測試項目和/或命名空間 X.Unit.Tests & X.Integrations.Tests。
我在我的主項目中的“命名空間目錄”(/Config)中有我的 DI 程式碼,但在我的集成程式碼測試中,如果我在我的基本裝置或設置中需要,我可能只是呼叫這些系統資料庫或覆蓋。
例如
/Config/ServiceRegistry.cs /Config/RepositoryRegistry.cs /Config/Bootstrapper.cs
在 global.asax 我呼叫 Bootstrapper.Init() 這將呼叫 x.AddRegistry(new ServiceRegistry()) 等等。
在我的單元測試中,您不需要僅在集成測試中使用 DI。在我的IntegrationTests 中,例如,如果我正在通過數據庫測試NHibernate,我可能會在TestSetUp 中使用RepositoryRegistry 初始化SM,並使用一個僅包裝GetInstance() 的輔助方法。
我不會拆分到 .Bootstraper 和 .Domain 項目,直到我必須… 三個項目,X、X.UnitTests、X.Integration 如果您以後需要更多移動。我來自一個背景/公司強制執行的數十個項目,它第一次減少感覺很髒,但現在不是,我會快速執行增長並在需要時重新組織解決方案結構。
如果你是唯一一個在這個項目上工作的人,我會先做對你有意義的事情。沒有什麼比強加給您不直覺的目錄或項目結構更糟糕的了。BaseController 類是在 \Core\ 文件夾還是 \Controller\ 文件夾中?我個人會查看控制器,但有些人發誓它應該在 \Core\ 或 \Bases 中。
第一個新手陷阱是認為您可以以錯誤的方式組織程式碼,並以某種方式反映了項目的成功。我見過一個文件夾中有 30 個文件的項目,而其他項目中有 30 個文件的 20 個文件夾。
第二個新手陷阱是忘記了與其他語言相比,您可以從 Visual Studio 的出色智能感知、程式碼導航工具和重構支持中受益。您還有一個編譯器,它可以讓放錯文件的痛苦大大減輕。如果你把東西放在“錯誤”的地方,沒關係,你總能找到它並將它拖到需要的地方。
老實說,我現在正在做一個項目,我什至不確定某些類在我的文件結構中的位置。Go To Definition/Declaration 是我經常使用的鍵盤快捷鍵。因為只有我在使用程式碼,所以這很好。如果我不得不在項目中添加另一個開發人員,我可能會清理乾淨。
就我個人而言,我傾向於將介面及其實現類型放在同一個文件夾中。IPaymentGateway 與 AuthorizeNetGateway 和 PaypalGateway 位於同一文件夾中。如果我無法在我的解決方案資源管理器側邊欄中一次查看該文件夾中的所有文件,那麼我將所有網關文件移動到 \Gateway\ 文件夾中。
隨著依賴注入添加到組合中,我建議您只關註名稱空間爆炸。你能做的最糟糕的事情就是用長的 using 聲明和別名弄亂你的引導程序和文件。
ForRequestedType<Customer>比干淨
using KevDog.Models using Customer=KevDog.Models.Customer要麼
ForRequestedType<KevDog.Models.Customer>避免此問題的另一種方法是在命名事物時明確:Customer、CustomerViewModel、CustomerController、CustomerDataRow、CustomerView
對於 TDD,您幾乎必須有兩個引導程序來管理您的具體類型。您真的不希望您的單元測試使用 AuthorizeNetGateway : IPaymentGateway,而是 StubGateway : IPaymentGateway。
現在我也是 DI 的新手,所以我傾向於讓事情變得非常簡單,並反映 101 級教程和文件。僅當特定情況需要並且您確切知道為什麼要這樣做時,才應使用基於建構配置的動態注入。
我通常也會保留 MVC 應用程序的預設結構。讓您的程式碼與 99% 的教程和影片具有相同的結構更容易。
希望這可以幫助。