我的asp.net控制器操作將FormCollection作爲參數。想將所有的業務邏輯移動到BLL層,但需要通過formcollection,是乾淨的嗎?
我然後依次通過我自己的收藏,做一個查找的形式集合中的值等
我提出我的所有代碼到我的商業邏輯層,並調用我的商業邏輯層在我的動作像:
SomeManager.Update(formCollection);
但我感覺有點疲憊,將表單收集傳遞給我的業務邏輯層。
我真的有一個選擇嗎?任何其他想法?
還是很好?
我的asp.net控制器操作將FormCollection作爲參數。想將所有的業務邏輯移動到BLL層,但需要通過formcollection,是乾淨的嗎?
我然後依次通過我自己的收藏,做一個查找的形式集合中的值等
我提出我的所有代碼到我的商業邏輯層,並調用我的商業邏輯層在我的動作像:
SomeManager.Update(formCollection);
但我感覺有點疲憊,將表單收集傳遞給我的業務邏輯層。
我真的有一個選擇嗎?任何其他想法?
還是很好?
您的業務邏輯層實際上是您的域模型,並且域模型應該以與技術無關的方式表示;即不依賴任何特定的技術,例如ASP.NET MVC,WPF,WCF,EF,NHibernate或其他。
這是最好的,如果你可以表達你的域模型爲波蘇斯(普通老式CLR對象),但是,因爲你已經懷疑,這排除FormCollections等ASP.NET MVC的具體類型。
如果您能夠將Update方法表示爲將域對象列表作爲輸入的方法,那將會更好。
這意味着您需要將FormCollection轉換爲強類型的域對象,然後再將它傳遞給更新方法。你需要一個Mapper來做到這一點。您可以編寫自己的自定義映射器或使用AutoMapper。
經驗法則是,您不應在業務層或更低層中引用System.Web.XXX中的任何內容。在這種情況下,您可以使用自定義模型綁定器來避免使用FormCollection。
有關創建模型活頁夾的更多信息,請參閱this post。
爲什麼不創建某種dto(數據傳輸對象),然後填充,然後通過它。它會更清潔一些。
我會創建一個映射器類,它接受一個FormCollection並返回一個實例或一個類的更新實例。
ManagerMapper.Create(的FormCollection) 或 ManagerMapper.Update(SomeManager,的FormCollection)
我已經有我使用的形式更新強類型集合,我只是通過形式收集和循環更新對象,然後傳遞給BLL來更新數據庫。 – mrblah 2009-12-28 21:39:17
而不是使用表單集合,爲什麼不使用自定義視圖模型?這樣內置的模型綁定器將爲您執行映射。 – 2009-12-29 11:30:43