2011-10-05 22 views

risposta

9

C'è un expample per la visualizzazione di iniezione in un post sul blog di Brad Wilson http://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.html

Le dichiarazioni degli altri che le opinioni permettono l'iniezione costruttore non del tutto corretto. Sì IDependencyResolver consente di creare viste con argomenti del costruttore. Ma a meno che tu non stia implementando il tuo motore di visualizzazione, questo non ti aiuterà affatto. I motori di visualizzazione esistenti come il rasoio richiederanno di avere un costruttore senza parametri. Ciò significa che puoi fare solo l'iniezione di proprietà sulle viste con loro.

Ma come gli altri hanno detto che non si dovrebbe comunque vedere l'iniezione. La tua vista dovrebbe essere stupida e basta rendere il modello di visualizzazione in HTML. Tutto ciò che richiede una dipendenza dovrebbe essere fatto nel controller o in un servizio.

+0

Cosa succede se si dispone dell'autorizzazione personalizzata che si desidera poter utilizzare come proprietà della vista? (per specificare alcune parti che non dovrebbero essere renderizzate in rasoio senza le autorizzazioni necessarie) –

4

Sì, è possibile, ma penso davvero che non sia una buona idea. Perché avresti bisogno di alcuni "servizi" a livello di vista? Ricordare la linea guida MVC chiave - una vista deve essere stupida. In effetti, dovrebbe essere solo una sorta di modello per la trasformazione dell'oggetto modello di visualizzazione in HTML, niente di più.

+0

Buon punto. Dovrebbe iniettare servizi nel 'Controller', non nella vista. – Steven

+5

traduzioni i18n nella vista. La vista contiene le chiavi e basta tirare la traduzione corretta. Nessuna ragione per cui non può essere nella vista. – BradLaney

+2

Che dire di un servizio di localizzazione o di configurazione che contiene solo testo? Sono tecnicamente ancora stupidi –

7

Non è possibile eseguire costruttore iniezione. Ma si può fare qualcosa di simile con, diciamo, Ninject:

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

e supponendo che si è impostato IDependencyResolver in Global.asax si dovrebbe avere correttamente la proprietà @Face inizializzato. Ma un avvertimento importante: non è possibile accedere a @Face in _Layout.cshtml, perché (secondo Brad Wilson) Layout funziona all'esterno di MVC e @Face sarà nullo quando si tenta di accedervi nella pagina di layout.

In ogni caso sono d'accordo con gli altri in quanto la visione non dovrebbe avere a che fare con qualsiasi logica complessa.

+1

QUESTO è fantastico! Non mi rendevo conto che potevi farlo con Ninject. –

+0

Non deve neanche essere Ninject. Autofac e altri faranno la stessa cosa, senza bisogno del decoratore. –

+0

Ha funzionato bene nelle pagine ereditate. Ma qual è la soluzione per accedere agli stessi metodi di classe iniettati all'interno del layout (masterpage) in MVC –

Problemi correlati