2009-05-17 11 views
1

他のエンティティと何らかのリレーションを持つエンティティがあり、これらのエンティティの一部だけを読み込んで別のビューに表示するとします。コントローラーに読み込むデータを定義することをお勧めしますか?

たとえば、このエンティティ与えられた:ビューで

public class Category 
{ 
    public int id; 
    public Category child; 
    public Category parent; 
} 

は、あなたがそれを示していないので、あなたが「親」プロパティをロードしたくない「ShowChild」。

このシナリオでは、私が望むプロパティだけを満たすDBからエンティティを読み込むために、とても良い "システム"をリポジトリに実装しました。それはこのように動作します:

カテゴリーカテゴリ= repo.FindCategory(ID、(int型)(LoadLevel.basic | LoadLevel.Child))

だから今は、ロードされただけで、IDと子の特性を持つカテゴリのインスタンスを持っています。

私がここで直面しているジレンマは、私がserviceLayer(ここにあるはずです)にLoadLevelを定義すると、私のサービスクラスに2つのメソッド "LoadCategoryWithChild"と "LoadCategoryWithParent"各ビュー(DRY違反?)。

public class CategoryService 
{ 
    public Category LoadCategoryWithChild(int id) 
    { 
     int loadlevel = (int) (LoadLevel.Basic | LoadLevel.Child); 
     return repo.FindCategory(id, loadlevel); 
    } 
} 

OR、私が見る他のオプションは、コントローラ(MVC違反?)でloadlevelを定義し、私のサービスクラスでただ一つの方法を実装することです:オプションが良いだろう

public class CategoryService 
{ 
    public Category LoadCategory(int id, int loadlevel) 
    { 
     return repo.FindCategory(id, loadlevel); 
    } 
} 

を?私はDRY違反が多くの冗長コードを書くことを意味するので、それはずっと悪いと思う。

答えて

1

私は間違いなく長いショットで2番目の解決策を好んでいます。私はコントローラがサービスクラスに必要なデータをヒントとして与えることはコントローラーにとって問題ではないと思います(最初の解決策では関数Bの代わりに関数Aを呼び出すことと同じことが率直にあります)。

呼び出し側が有効なオプションは、私がお勧め

0

これはおそらくオブジェクトリレーショナルマッピングの第1の問題です。ほとんどのORMソリューションは、オブジェクトのプロパティが遅延ロードされることによって回避されます。大半のユースケースに対応するロードメカニズムが1つだけ必要です。追加のプロパティを使用する少数派の関数は、プロキシを介して要求されたときに、ビューから必要なものをゆっくりと読み込みます。

個人的に私は、上記のソリューションのいずれか、または実際には透過プロキシの3番目のソリューションのファンではありません。ただし、プロキシー・ソリューションはより一貫して動作し、Viewレイヤーのマイナーな変更で頻繁に失敗することはなく、主な影響は通常わずかなパフォーマンスです。それが問題であることが判明したら、いつでも最適化することができます。

例としてHibernateは、この方法を使用しますが、プロパティが遅延ロードされているかどうかを伝える必要があります。 Hibernateでのプロキシ経由の遅延ロードは、トランザクション内にある必要があるため、すべての状況で遅延ロードすることもできません。これらの制限は、実用的な性能上の理由から存在する。データベースのマッピング方法のうち、プロキシー/遅延ロードを使用するのが最も簡単ですが、それ自体の複雑さが伴います。

+0

遅延ロードを実行するタイミングと実行しないタイミングは、(N)Hiberanteが必要です。 – Paco

+0

私は言いたいことがある – Paco

0

あるかを知っているように、私もint型であることと、列挙型ではないために、第2のパラメータを変更します

public Category LoadCategory(int id, params LoadLevel[] levels) 
{ 
    int loadLevel = LoadLevel.Basic; 

    foreach (var level in levels) 
     loadLevel = loadLevel | level; 

    return repo.FindCategory(id, loadlevel); 
} 

使用例:

LoadCategory(0, LoadLevel.Parent, LoadLevel.Child); // self + parent+ child 
LoadCategory(1, LoadLevel.Child); // self + child 
LoadCategory(2); // self only 
関連する問題