2016-07-11 1 views
0

これは、ビジネスクラスで余分な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コンパイルされています(スイッチをオフにしない限り)。インテリセンスはしばしば、コンパイル時のバグがランタイムに漏れる可能性があります。
  • viewsを使ってデバッグすることはできますか?それだけです
  • プレゼンテーションコードとビジネスロジックを混在させるのは、一般的に「悪い考え」です。主に2つの問題があまりにも混ざり合っているためです。
  • 例ではList<>を使用しています。それでは、MVCではどうですか?
  • どのようにエラー処理しますか?例外をキャッチして別のマークアップを出力していますか?それはどのように表示テンプレート、部分的なビューなどのものに変換されますか?

とにかく、それはすべて私の意見です:ちょうどなぜあなたはこのフレームワークを使用して、どのようなパフォーマンスの最後の一滴が他の方法であなたを要するかもしれませんしている自問してみてください。しかし決定はあなた次第です。

+0

上記の点に基づいて答えてくれてありがとう、おそらく私の生産データが巨大になるわけではないので、私はそのロジック自体をビジネスにすることに決めました。 –

+0

悪いアプローチではありません - 私はいつも「目的に合っている」と思っています。パフォーマンスに満足すれば、利用できるツールの利便性を利用してください。あなたのアプリが大きくなり、パフォーマンスが低下し始めると、*なぜあなたが調整しているかを知ってから、再評価してください:)。 – Katstevens

2

私は保守性vsパフォーマンスはここで質問してはいけないと思います。すべて約時間です。ソリューションを開発/読み込み/変更するのに必要な時間が短ければ短いほど良いでしょう。したがって、ソリューションを複数の層に分割する必要があります。データレイヤーに何か変更があった場合は、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のクエリなどで)彼にかかるかもしれないことをOPが理解する限り、 – Katstevens

関連する問題