Wir arbeiten an einer Art von Cloud-CMS mit ASP.NET MVC-Technologie und haben einige Hindernisse auf dem Weg gefunden. Es gibt eine Reihe von Parametern, die der Benutzer über das Bedienfeld ändern kann, um in Views zu gelangen. Beispiel: Facebook-Anwendungs-ID zum Initialisieren der Facebook JS-API. Oder zusätzlicher Text, der auf der Seite angezeigt werden soll. Oder Hintergrundbild. Momentan verwenden wir keine DI, um diese Parameter zu übertragen, stattdessen fügen wir sie dem ViewModel hinzu, aber dies ruiniert die ASP.NET MVC-Art der Arbeit mit Modellen (z. B. Formularvalidierung, Bindungen usw.)Sollte ich Dienste in meine MVC-Ansichten injizieren?
Es sieht so aus, dass die Verwendung von DI, um Dienste für die Bereitstellung von Parametern, Texten und Bildern zu injizieren, meine Ansichten weniger abhängig von Controller-spezifischen machen könnte, und es gibt sogar einige Microsoft-Technik, um es zu tun http://www.asp.net/mvc/tutorials/hands-on-labs/aspnet-mvc-4-dependency-injection#Exercise2. Es gibt jedoch viele Antworten auf Foren, die verhindern, dass Dienste mit DI in Views eingefügt werden.
Also die Frage: Was ist ein richtiger Weg, um einige Dienste in Views zu injizieren? Oder sollte ich es überhaupt nicht tun und etwas ist falsch im Anwendungsdesign?
UPDATE: einige echte Code-Beispiele (jetzt sind wir Modell unter Verwendung der Dienste zu injizieren) aus der Datenbank
Injizieren Texte (sie haben Benutzer editierbar sein, wie es CMS ist):
<div class="steps">@Html.Raw(Model.Texts["Main", "Step2"]</div>
Injizieren von Übersetzungen aus der Datenbank (tatsächlich ist es Lokalisation):
<div class="gonfalon">@Model.Translations["Title_Winners"]</div>
Injizieren Parameter (aus der Datenbank, COU ld ist anforderungsspezifisch; wenn die Site verschiedene Domänen zum Beispiel hat, sollte Facebook-Anwendung pro-Domain sein):
Facebook.Initialize(Model.Parameters["FbApplicationId"], Model.Parameters["FbApplicationSecret"]);
Das Problem des aktuellen Ansatzes ist, dass dieser Code vom Wettbewerb Mechaniker genommen hat. Es ist definitiv außerhalb des Wettbewerbs Geschäftsumfang mit benutzerdefinierten Texten, Übersetzungen oder Facebook-Anwendung Id befassen. Haben die Schnipsel aus der Antwort unten geändert werden ein: Auch sie das Modell als Modell Modelle nicht unbedingt der Business-Bereich, sondern beschäftigt sich mit eine Menge Dinge tatsächlich gehört anzeigen (wie Übersetzungen und individuelle Texte)
UPDATE 2 Ruinen etwas mehr generic:
public static class WebViewPageExtensions
{
public static I ResolveService<I>(this WebViewPage page)
{
return DependencyResolver.Current.GetService<I>();
}
}
Sieht nach der besten Lösung aus. Ich habe auch einige echte Codebeispiele für die Dinge hinzugefügt, die wir jetzt aus dem Modell nehmen, aber gerne loswerden würden. –