![](/img/trans.png)
[英]Do I need to Separate Business Objects and Business Logic? Asp.net MVC with Repository Pattern in C#
[英]ASP.NET MVC Entities, DTO, Business objects, ViewModels? How do i manage this?
我非常忙於新MVC應用程序的架構,但我對如何管理不同類型的對象感到非常困惑。 混淆是關於實體,業務對象和視圖模型之間的關系。 我將用一個例子描述我的困惑:
我已經使用不同的項目設置我的Web應用程序:MVC前端,BLL,DAL,常見事物等。
假設我有一個自行車列表的視圖。 我想顯示自行車的細節,如顏色,尺寸,制造商。 但在我的數據庫中,Bike和Manufacturer是兩個不同的表,因此在我的Entity Framework上下文中,這些也是兩個不同的類。
所以我有兩個實體自行車和制造商。 但在我的業務需求中,我認為他們需要成為一個單獨的對象,我可以在業務邏輯中操作或使用它。 然后有我的觀點,需要一個(視圖)模型。 這也應該是具有來自不同表的屬性的組合ViewModel。
我該如何處理? 我是否需要從我的DAL獲取Bike和Manufacturer對象,並在我的BLL中創建一個業務對象,在做了一些業務邏輯之后,我應該在我的控制器中創建一個ViewModel嗎? 或者我的DAL是否需要返回合並的業務對象? 或者我可以將實體對象用作業務類嗎? 或者我還可以將我的業務對象用作ViewModel嗎?
我希望我的問題很明確,任何人都可以給我一個很好的建議,告訴我需要哪個對象以及創建不同類型對象的方式,地點和時間,以及這些類應該在哪個層...
您可以擁有自定義業務實體,這些實體將在您的視圖中引用。
在您的業務實現中,您可以使用一些映射器將您的Entity Framework實體映射到您的自定義業務實體,您可以使用Automapper來實現此目的。
我希望這將有所幫助。
你的問題的答案很簡單。 您的不同模型層之間沒有任何關系。 它們是完全孤立的,不互相引用。 一點也不。 因此,沒有什么可以混淆的。
您的圖層的不同部分中的代碼可以在兩個UI-> Business和Business-> Data之間進行映射,但這應該是它們之間任何交互的程度。
您應該擁有一些常用功能,您將擁有Business和EF實體的所有映射。
在您的實現中,您將映射只需要求您的映射器提供實際實體。
應該有一些通用的類可以為你創建映射。
像這樣的東西
public static void CreateTestMapping() { Mapper.CreateMap<DataAccess.Entities.Test, Business.Entities>() .ForMember(s => s.Col1, d => d.MapFrom(t => t.Colabc)) .ForMember(s => s.Col2, d => d.MapFrom(t => t.ReferenceTable.RefTableCol1)); }
在您的業務實現中,您將使用此映射將Business.Entities轉換為EF.Entities,反之亦然
Mapper.Map<Business.Entities.Test, EF.Entities.Test>(source, destination);
我會做的是:
您的DAL返回List<Bike>
和List<Manufacturer>
。
然后你的業務層應該操縱這些並返回到asp.net MVC一個合適的對象。
例如, List<Manufacturer>
,其中包含List<Bike>
每個項目。
創建適當的ViewModel並添加Controller邏輯來操作它們但是不要在那里進行任何核心業務操作,只需要UI操作以適合您的視圖。
另外,我建議不要將您的UI與DAL綁定。
保持UI項目引用公共庫+業務層項目。
讓業務與DAL進行通信。
恕我直言,混淆的一部分來自於你“不能”打破你的項目之間的所有鏈接,即使你想要“設計”和分離關注原因。
嗯,實際上你可以(並且可能應該)打破,但成本至少是:失去了知識分子和/或編組編碼。
最后,您的項目至少通過約定進行鏈接。 一個項目期望來自另一個項目的行為。 如果您發布天氣數據,您希望您的DAL提供天氣數據而不是財務數據,即使應該明智地處理此案例。
至少有一個項目必須公開接口/ DTO,另一個項目必須實現此接口。
通常和謙卑地,我試圖使業務邏輯獨立:可以在不參考任何其他項目的情況下構建業務(請注意:我說的是項目不是圖層)。 所以我的抽象類或接口在業務或域項目中。 原因:最可能的變化是GUI技術的變化或持久性技術的變化,所以如果你想與我進行互動,這里是合同(這里是假朋友)。
因此,網站(或任何GUI)項目引用業務項目和DAL項目,DAL項目引用業務項目。
但是當你停止掌握你的上下文的范圍(DbContext,ObjectContext,...)時,邪惡開始了。 其他說法試圖避免向Razor提供附加物體。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.