2011-10-05 11 views

答えて

9

ブラッド・ウィルソンのブログ記事でビュー注射用expample http://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.html

ビューはコンストラクタ・インジェクションは完全に正確ではないことを許可し、他のステートメントがあります。はいIDependencyResolverは、コンストラクター引数を持つビューの作成を可能にします。しかし、独自のビューエンジンを実装していない限り、これはまったく役に立たないでしょう。カミソリのような既存のビューエンジンでは、パラメータのないコンストラクタが必要です。つまり、それらのビューでプロパティインジェクションだけを行うことができます。

しかし、他の人が言ったように、あなたはビューインジェクションをとにかくすべきではありません。ビューはダムにして、ビューモデルをHTMLにレンダリングするだけです。依存関係を必要とするものは、コントローラまたはサービスで行う必要があります。

+0

ビューのプロパティとして使用できるようにするカスタム権限があればどうなりますか? (必要な権限なしで剃刀でレンダリングすべきでない部分を指定する) –

4

はい、可能ですが、実際にはそれは良い考えではないと思います。ビューレベルで「サービス」が必要なのはなぜですか?キーMVCガイドライン - を覚えています。ビューはダムでなければなりません。実際、ビューモデルオブジェクトをHTMLに変換するためのテンプレートにすぎません。

+0

良い点。彼はビューではなく、 'コントローラ'にサービスを注入するべきです。ビュー内での翻訳は – Steven

+5

です。ビューにはキーが含まれており、正しい翻訳を引き出すだけです。それがなぜそのような見解にはないのかはわかりません。 – BradLaney

+2

テキストだけを含むローカリゼーションまたは構成タイプのサービスはどうですか?彼らは技術的にはまだダムです –

7

コンストラクタ注射を行うことはできません。

 
    public abstract class CustomViewBase<TModel> : WebViewPage<TModel> where TModel : class 
    { 
     [Inject] 
     public IFace Face 
     { 
      get; 
      set; 
     } 
    } 

そして、あなたはあなたが正しく@Faceプロパティが初期化されている必要がありますGlobal.asaxの中IDependencyResolverを設定していると仮定すると:しかし、あなたはNinject、たとえば、このような何かを行うことができます。 重要な注意点:_Layout.cshtmlの@Faceにアクセスすることはできません。(Brad Wilsonによると)LayoutはMVCの外で動作し、レイアウトページで@Faceがnullになるためです。

いずれにしても、複雑なロジックを扱う必要がないという点で私は他の人に同意します。

+1

これは素晴らしいです!私はあなたがNinjectでそれを行うことができるとは気づきませんでした。 –

+0

Ninjectである必要はありません。オートファックと他の人たちはデコレータを使わずに同じことをするでしょう。 –

+0

継承されたページでうまくいきました。しかし、MVCのレイアウト(masterpage)内の同じ注入されたクラスメソッドにアクセスするためのソリューションは何ですか? –

関連する問題