2016-07-11 31 views
0

我這樣做是爲了避免Business類中額外的View Model映射。 實施例:在可以寫入控制器/業務的視圖中編寫C#代碼的性能影響是什麼?

public class PatientInfoBusiness 
{ 
    public List<PatientInfo> GetPatientInfo() 
    { 
     IPatientInfoService proxy = new VRFactory().GetPatientInfoServiceProxy(); 
     var piData= proxy.GetPatientInfoSectionData(); 

     //var patientInfoVM= new List<patientInfoVM>(); 
     //piData.ForEach(a => patientInfoVM.Add(
     //               new patientInfoVM 
     //               { 
     //                AcknowledgedUserName = a.AcknowledgedUserName, 
     //                Description = a.Description, 
     //                PriorityCode = a.PriorityCode, 
     //                Status = a.Status 
     //               } 
     //          ) 
     //    ); 

     return piData; 
    } 
} 

移註釋的代碼中的上述業務的視圖,通過循環和在HTML顯示。這種方式不需要patientInfoVM View Model。 但是我完全跳過了業務層,直接在服務層綁定實體!

+0

這將變得很難維護,但我個人認爲這會減少負載,通常生成的數據放在視圖包中用於運輸,並且當到達視圖時需要某種轉換和鑄造(我看到的性能超過除非使用強類型視圖),我也需要知道答案 –

+2

視圖永遠不應該包含業務邏輯。 – Phill

回答

0

沒有任何硬性指標,我只能提供我的意見,但代替其他更多的分析驅動的響應,在這裏。

我會說是的,把你的業務邏輯放在一個單獨的層會造成更多的開銷,因此性能更差。然後我又說,如果我用原始機器碼寫的話,我可以獲得更多的性能,但那會很瘋狂。因此,這裏有我的原因,爲什麼略差性能是值得的:

  • 維護的整個看法混合數據訪問代碼會成爲一場噩夢 - 你最終會重新編寫相同的訪問樣板代碼很多次(因爲您不能在其他視圖中重用查詢邏輯)
  • 視圖通常是JIT編譯的(除非您將其關閉),並且通常智能感知不能完全滿足您正在進行的操作,所以你可以將編譯時錯誤泄漏到運行時
  • 通過視圖進行調試很糟糕 - 它只是做
  • 您的演示代碼和您的業務邏輯混合在一起通常是一個「壞主意」 - 主要是因爲這兩個問題太混雜了
  • 您在示例中使用的是List<>,這是一個性能較低的便捷結構:所以它OK,爲什麼不用MVC?
  • 你如何在你的視圖中錯誤處理?你是否捕捉異常並輸出不同的標記?這是如何轉化爲顯示模板,局部視圖和其他類似的東西?

無論如何,這是我的觀點:只要問自己爲什麼使用這個框架,什麼性能是最後一滴可能會花費你在其他方面。但是,這個決定取決於你。

+0

感謝您的回答,基於上述觀點,因爲我的生產數據可能不會很大,所以我決定讓邏輯成爲業務本身。 –

+0

不是一個壞的方法 - 我總是認爲這些東西「符合目的」:如果您對性能表現滿意,請使用可用工具的便利性。當你的應用程序變得很大,性能開始受到影響時,重新評估,然後當你知道*爲什麼*你正在調整:)。 – Katstevens

2

我不認爲可維護性與性能應該不是這裏的問題。這全是關於時間。您需要開發/閱讀/修改解決方案的時間越少越好。因此,您需要分層分解您的解決方案。如果數據層中的某些內容發生變化,則不必修改GUI層。 不應該進行預優化。但是有一些技巧可以更有效地編寫代碼。您可能會返回IEnumerable<patientInfoVM>。這將創建patientInfoVM懶惰。 這隻會在迭代時創建項目。

public class PatientInfoBusiness 
{ 
    public IEnumerable<PatientInfo> GetPatientInfo() 
    { 
     IPatientInfoService proxy = new VRFactory().GetPatientInfoServiceProxy(); 
     var piData= proxy.GetPatientInfoSectionData(); 

     return piData.Select(a => new patientInfoVM 
     { 
      AcknowledgedUserName = a.AcknowledgedUserName, 
      Description = a.Description, 
      PriorityCode = a.PriorityCode, 
      Status = a.Status 
     }); 
    } 
} 

如果您遍歷結果唯一的,你可以使用它像這樣:

foreach(var patientInfo in GetPatientInfo()) 
{ 
    // do something. 
} 

但是如果你需要使用結果超過的,你應堅持的項目:

var patientInfoList = GetPatientInfo().ToArray(); 

foreach(var patientInfo in patientInfoList) 
{ 
    // do something. 
} 

foreach(var patientInfo in patientInfoList) 
{ 
    // do something. 
} 
+0

確實如此:只要OP瞭解延遲執行和延遲加載可能會以其他方式(例如,N + 1個查詢)來支付他的費用。 – Katstevens

相關問題