2012-01-19 7 views
1

私はコンストラクタに注入されたリポジトリを持っている基本クラスを持っていますが、現在はそれから派生したクラスにもこれらのパラメータが必要ですが、リポジトリは基本クラスのみで使用されます。基本クラスだけでコンストラクタを経由しないでください。そして、最も重要なことは、それは良い考えですか?Ninject経由でのみベースクラスにリポジトリをバインドしますか?

public class HtmlPageModel 
{ 

     private readonly IHtmlPageRepository _repository; 

     public HtmlPageModel (IHtmlPageRepository repository) 
     { 
      _repository = repository; 

     } 
} 


public class VideoPageViewModel : HtmlPageModel 
{ 

     public VideoPageViewModel(IHtmlPageRepository repository) : base(repository) 
     { 

     } 
    } 
+2

クラス階層を再考する必要があります。これは、Ninject – BrokenGlass

答えて

4

ビューモデルには依存性はまったくないはずです。リポジトリをコントローラに注入し、そこから値を割り当てます。

また、多くのページが同じベースビューモデルを使用している場合、これはページの一部が多くの状況で表示されていることを示しています。この場合、この領域のカスタムコントローラとビューを用意し、Html.RenderActionを使用してこの部分をレンダリングする方がよいでしょう。

+0

興味深い私は領域を見ていません。コントローラーを薄くしておきたいので、コントローラー内のリポジトリーで何も実行したくないのです。私は、他のモデルからなる1つのビューモデルですべての必要な部分をアセンブルしようとしています... – keeg

+1

私は十分にはっきりしていないようです。領域では、MVC領域を意味するのではなく、画面上のHTMLページの領域です。例えば。あなたのユーザ名、評判などが表示されているのでここにステータスラインが表示されます。これは、ViewModelまたはコントローラを継承する必要なく、独自のController、View、およびViewModelで行うことができます。コントローラをスリムに保つことも良いことです。しかし、ビューモデルに作業を委ねるのは悪い習慣です。ビューモデルは、ロジックなしのダムデータオブジェクトである必要があります。いくつかのタスクを実行し、コントローラがそれらを使用してビュー・モデルを満たすサービスをいくつか紹介します。 –

2

私はまだ私の以前のコメントに立つ:あなたは、あなたのクラス階層を再考する必要があり、これはあなたがNinjectを回避すべきものではありません。

基本クラスがリポジトリを受け入れる場合、すべての派生クラスも受け入れる必要があります。

kernel.Bind<IHtmlPageRepository>() 
     .To<HtmlPageRepository>() 
     .WhenInjectedInto<HtmlPageModel>(); 

kernel.Bind<IHtmlPageRepository>() 
     .To<NullRepository>() 
     .WhenInjectedInto<VideoPageViewModel>(); 
+0

で回避する必要はありません。これは恐ろしいことですか? – keeg

0

これは基本的に同じ答えである:別の方法として、あなたはしかし、

ターゲット型による結合

はNinjectでWhenInjectedInto()を使用して達成することができる(Null Object patternを参照)は、基本的に何もしませんあなたのVideoPageViewModelに特別にNullRepositoryを注入でき壊れたガラス。別の基本クラスを作成し、現在の基本クラスの属性/機能をそのクラスに移動するだけでなく、そのリポジトリに関連するコンストラクタ/機能を移動しないでください。

+0

わかりません。その基本クラスのすべての属性と機能は、ビューモデルで必要なものをクエリするリポジトリを必要とします。 – keeg

関連する問題