2010-04-05 10 views
6

Ich habe eine ASP.NET Web Forms-Seite, die der Referent mit Steuerelementen füllen muss. Diese Interaktion ist etwas empfindlich für den Seitenlebenszyklus und ich frage mich, ob es einen Trick gibt, von dem ich nichts weiß.Entkopplung von Ansicht, Präsentation und ASP.NET Web Forms

Ich möchte über die ganze Sache praktisch sein, aber nicht die Testbarkeit gefährden.

Zur Zeit habe ich dies:

public interface ISomeContract 
{ 
    void InstantiateIn(System.Web.UI.Control container); 
} 

Dieser Vertrag eine Abhängigkeit von System.Web.UI.Control hat, und ich brauche, dass die Lage sein Modell Dinge zu tun, mit der ASP.NET Web Forms-Programmierung. Weder die Ansicht noch der Präsentator kennen jedoch Kenntnisse über ASP.NET-Serversteuerelemente.

Wie kann ich das umgehen? Wie kann ich mit dem ASP.NET Web Forms-Programmiermodell in meinen konkreten Ansichten arbeiten, ohne eine System.Web.UI.Control-Abhängigkeit in meinen Vertragsassemblies zu nehmen?

Um die Dinge ein wenig zu klären, ist diese Art von Schnittstelle alles über UI-Zusammensetzung (mit MEF). Es ist durch den Rahmen bekannt, aber es wird wirklich nur aus der konkreten Sicht aufgerufen. Die konkrete Ansicht ist immer noch die einzige Sache, die ASP.NET Web Forms kennt. Diese öffentlichen Methoden, die InstantiateIn(System.Web.UI.Control) sagen, sind jedoch in meinen Vertragsassemblys vorhanden, und das bedeutet eine Abhängigkeit von ASP.NET Web Forms.

Ich habe über einen Doppelversandmechanismus oder sogar Besuchermuster nachgedacht, um zu versuchen, um dieses Problem zu arbeiten, aber ich weiß noch nicht, in welche Richtung ich gehen möchte, und ich hätte wirklich gerne etwas dazu.

+0

Warum können die Ansicht und der Präsentator keine Kenntnisse über ASP.NET-Serversteuerelemente haben? –

+0

@Kirk Testbarkeit? wird es nicht schwer sein (fast unmöglich), diese Dinge zu verspotten? –

+0

Könnten Sie bitte http://stackoverflow.com/questions/8851933/event-bubbling-and-mvp-asp-net beantworten? – Lijo

Antwort

0

Eine Möglichkeit, Ihren Vertrag von Ihrem Web-Steuerelement zu entkoppeln, besteht darin, einen separaten Schreiber zu haben, der die Informationen von ISomeContract abruft und in Ihrem Control-Container ablegt. Dies könnte sich in einer Assembly befinden, die sowohl die Vertragsassembly als auch System.Web referenziert.

+0

Können Sie ein konkretes Beispiel geben? –

0

Ich habe gelesen über agile Techniken, tdd, Komponententests, solide, Design-Muster und fühlte sich völlig machtlos, um die Lücke von all dieser wunderbaren Theorie zu asp.net Webforms zu überbrücken.

ich versucht, eine Lösung für dieses Problem früher heute ein anderer gehen hatte, und fanden diesen Artikel zu finden: von einem Buch, das ich dachte, würde lösen alle

Es ist ein Auszug meine Probleme, aber dieses Kapitel ist wirklich nur eine Einführung in die Möglichkeiten, das MVP-Muster in Webforms zu implementieren und es endet damit, dass es nicht wirklich praktisch ist. Der Rest des Buches dreht sich darum, asp.net MVC zu testen, soweit ich mich versammelt habe.

Es gibt auch dieses neue Projekt, das die Liebe zurück in die Webforms Plattform bringen soll:

0

In "normalen" ASP.NET Web-Formulare, um Ihre Seite/Benutzersteuerung ist technisch verantwortlich für die Verarbeitung und setzt seinen Lebenszyklus auf den Code. Die Seite ist der Moderator und die Ansicht, ob Sie es mögen oder nicht.

Die meisten Versuche, das MVP-Muster in dieser Umgebung zu implementieren, fügen einer bereits übermäßig komplexen Umgebung einfach übermäßige Komplexität hinzu! Vorgeben, dass eine andere Klasse der Moderator ist, ist nur das ... vortäuschen. (In MVC Websites steuert der Controller wirklich den Code, und die Sicht nicht, so dass dieses Argument nicht mehr gilt.)

Meine Empfehlung ist es, die Ansicht nach seinem eigenen Lebenszyklus zu sehen, und lassen Sie es Rufen Sie Repositories und Model-Klassen auf, um Daten abzurufen/zu speichern und Befehle aufzurufen.

Bei diesem Ansatz müssen die Model-Klassen nichts über System.Web wissen. Dieselben Model-Klassen könnten dann in zukünftigen MVC-Websites oder Silverlight oder als Web-Service für WPF-Anwendungen oder eingebettet in eine WPF-Anwendung usw. verwendet werden. Es ist Aufgabe der View, zu bestimmen, wie implementiert wird (mithilfe von Steuerelementen). die Antwort/Daten, die es vom Modell erhält.

Die Modellklassen können so oft getestet werden, wie Sie möchten, wenn Sie sie richtig eingerichtet haben, um die Abhängigkeitsinjektion zu unterstützen.

Hoffe, dass hilft!

2

Nicht sicher, wie ein Besucher das Problem lösen würde. Aber warum Ihre Verträge nicht so aussehen hat:

public interface ISomeContract 
{ 
    void InstantiateIn(IControl container); 
} 

mit einer IControl Implementierung, möglicherweise in einer anderen Baugruppe Ihren Vertrag Montag sauber zu halten, die über die ASP.NET System.Web.Control Wraps, wie:

public class AspnetControl : IControl 
{ 
    public AspnetControl(System.Web.Control control) { } 

    // IControl members that dispatch to control 
} 

Obwohl es eine hohe Wahrscheinlichkeit gibt, dass IControl am Ende sehr wie ein System.Web.Control aussehen würde (und damit den Punkt der Abstraktion überhaupt zunichte machen würde), wäre es immer noch sehr überprüfbar, und Ihre Ansicht und Moderatoren müssen nichts über ASP.NET wissen.

+0

Ihre IControl-Schnittstelle kann bestimmte "Lifecycle" -Ereignisse offen legen, auf die Ihr Controller achten kann - meistens wickeln Sie nur die Webformular-Ereignisse ein (vielleicht erleichtert eine kleine Hilfsklasse diesen Schmerz?), Aber wenn Sie Ihre Ansichten wünschen um völlig dumm zu sein, dann musst du damit leben. –