我在控制器中有很多代碼,我不知道該把它放在哪裏。首先我重新考慮它,以便它乾燥,但仍然在控制器中。重構MVC控制器代碼。控制器或型號
對代碼進行重新分解時,如何將某些東西移動到模型以及何時將某些東西保存在控制器中,遵循什麼是一個很好的指導原則?
我在控制器中有很多代碼,我不知道該把它放在哪裏。首先我重新考慮它,以便它乾燥,但仍然在控制器中。重構MVC控制器代碼。控制器或型號
對代碼進行重新分解時,如何將某些東西移動到模型以及何時將某些東西保存在控制器中,遵循什麼是一個很好的指導原則?
您的模型一般不應包含任何業務邏輯。如果確實如此,請將該模型提取到ViewModel
,其中唯一的邏輯應該是您的顯示相關代碼。任何業務方法都應該存在於一個單獨的類中。有些人傾向於始終使用ViewModels
而不是一般的整體模型(例如,CustomerEditViewModel
而不僅僅是Customer model
)。
控制器應該非常輕便,不應該有數據訪問代碼。我通常會調用存儲庫方法()輕鬆加載數據,並將Facade Pattern作爲所有業務方法的網關。
例如,而不是數據加載代碼,一些計算,有的保存代碼,這可能全部被放入一個門面類,它的模型或customerId
和做一些事情,如:
CustomerRepository repository = new CustomerRepository(); Customer customer = repository.GetCustomer(customerId); // call some business methods, assign data, etc. .. .. // now save repository.SaveCustomer(customer);
你存儲庫類通常編碼到接口;這使得對這些類進行存根/模擬非常容易加載「假」數據,並且還可以將控制器和外觀從直接鏈接到類的具體實現,而不是鏈接到接口。
控制器應主要包含協調代碼。因此,如果您有代碼執行某項業務或域名功能,您可以移動即。我傾向於使用應用程序服務或簡單的任務。就像IImageService或IDocumentService(雖然實現可能會變得相當臃腫)。我也喜歡使用諸如ILoginTask之類的單個任務。
然後注入實現(我使用Castle Windsor與自定義控制器工廠)。
Just my 2c --- HTH