簡體   English   中英

ASP.NET MVC實體,DTO,業務對象,ViewModels? 我該如何管理?

[英]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項目引用業務項目。

  • 控制器從DAL獲取數據並將其提供給域/業務邏輯
  • 然后,控制器將未附着的結果提供給剃刀,和/或通過DAL保持結果。

但是當你停止掌握你的上下文的范圍(DbContext,ObjectContext,...)時,邪惡開始了。 其他說法試圖避免向Razor提供附加物體。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM