ASP.NET MVC Stefan Lieser Web:

Slides:



Advertisements
Ähnliche Präsentationen
Software Engeniering II
Advertisements

Dynamische WEB-Applikationen
M a r c – o l i v e r p a h l Informatik I – Kapitel 7 Klassen und höhere Datentypen Zusammenfassung des Kapitel 7 Küchlin, Weber, Einführung in die Informatik,
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
Entwicklung und Einsatz von Smart Client-Anwendungen Jens Häupel Developer Evangelist Microsoft Deutschland GmbH Dirk Primbs.
1. 2 Microsoft.NET Überblick Dirk Primbs Technologieberater Developer Platform & Strategy Group Microsoft Deutschland GmbH.
Fakultät für informatik informatik 12 technische universität dortmund Specifications Peter Marwedel TU Dortmund, Informatik 12 Graphics: © Alexandra Nolte,
Design by Contract with JML - Teil 2
Personalisierte Benutzeroberflächen BFD WS 12/13 Übung 6 Producing an end-user experience that is uniquely appropriate for each individual. [Sears]
Dipl. Inf. (FH) Paul Mizel Compilerbau.NET Compiler / Codegeneratoren / Skriptsprachen.
Objektrelationales Mapping mit JPA Advanced Mapping Jonas Bandi Simon Martinelli.
Objektrelationales Mapping mit JPA Entity Mapping Jonas Bandi Simon Martinelli.
Benötigte Applets Startseite: in HTML-Format Applet auf der Startseite Das Applet, das auf der Startseite geladen wird, wird die vier Buttons und die eine.
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
Proxy Pattern Vorlesung Design Patterns Sieglinde Heinrich
Modulare Programmierung
DVG Verkettete Listen Verkettete Listen. DVG Verkettete Listen 2 Primitive Datentypen Vorteile: –werden direkt vom Prozessor unterstützt.
Hänchen & Partner GmbH 1 Web-Anwendungen mit dem Jakarta Struts Framework 3.Juli 2003 Martin Burkhardt.
Visual Extend Features für Entwickler deutschsprachige FoxPro User Group Uwe Habermann VFX 05 D.
WebCast: Managed Smart Tags mit VSTO Jens Häupel.NET Technologieberater Microsoft Deutschland GmbH
Divide and Conquer Eclipse RCP und Spring in verteilten Anwendungen Stefan Reichert | Lufthansa Systems Benjamin Pasero | IBM Rational.
M A X - P L A N C K - G E S E L L S C H A F T Bericht des Partnerinstituts Sabine Krott 1.0 Pilotentreffen im Harnack-Haus, 8. Juni 2006 Distribution:
Status eSciDoc Malte Dreyer eSciDoc Hauptaktivitäten in 2006 Abstimmung mit den Zielgruppen Funktionale Anforderungserhebung mit.
Laurie Clarcq The purpose of language, used in communication, is to create a picture in the mind and/or the heart of another.
Fesselspiele Data Binding in WPF und Silverlight
Testing using Mock Obejcts
Medien zwischen Technologie und Gesellschaft Dozent: Herr Prof. Dr. Manfred Thaller SS 13 Referent: Christian Braun.
VS one Veranstalter: VSone Feb. 08 Folie 1 Copyright by XML-Serialisierung zur Persistierung von Objekten Thomas Schissler
Institut AIFB, Universität Karlsruhe (TH) Forschungsuniversität gegründet 1825 Towards Automatic Composition of Processes based on Semantic.
OO implementieren Teil IV Objekte erzeugen. © René ProbstModul 226IV - 2 Von der Klasse zum Objekt Plan Bau Objekt Klasse Instanzierung Objekt Das Objekt.
Test Driven Development - Romano Adler-
Automated Software Testing
Sanjay Patil Standards Architect – SAP AG April 2008
demo Kostenlos bis 5 Benutzer Entwickelt für kleine Teams Source Control Work Item Tracking Build Automation Mehr… Support für Visual Studio.
BAS5SE | Fachhochschule Hagenberg | Daniel Khan | S SPR5 MVC Plugin Development SPR6P.
3rd Review, Vienna, 16th of April 1999 SIT-MOON ESPRIT Project Nr Siemens AG Österreich Robotiker Technische Universität Wien Politecnico di Milano.
Deutsch 1 G Stunde. Donnerstag, der 18. Oktober 2012 Deutsch 1, G Stunde Heute ist ein E- Tag Unit: Family & homeFamilie & Zuhause Objectives: Phrases.
Deutsch 1 G Stunde. Dienstag, der 16. Oktober 2012 Deutsch 1, G Stunde Heute ist ein B- Tag Unit: Family & homeFamilie & Zuhause Objectives: Getting to.
Entity Mapping Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.
Advanced Mapping Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.
RateMe Slides. Ablauf Präsentation des Konzepts (5-10 min) Demonstration der laufenden Software (5-10 min) Fazit der gesammelten Erkenntnisse.
Your name Bedeutung von Internet- Technologien Gruppe 1 Andreas Feuerstein Philipp Hochratner Christian Weinzinger.
RateMe Slides. Ablauf Präsentation des Konzepts (5-10 min) Demonstration der laufenden Software (5-10 min) Fazit der gesammelten Erkenntnisse.
Developer Day Webseiten auf Windows Azure hosten Britta Labud bbv Software Services AG Roland Krummenacher bbv Software Services AG.
Jean-Claude Trachsel Senior Consultant Trivadis AG.
Neno Loje Berater & MVP für Visual Studio ALM und TFS (ehemals VSTS) Hochqualitative Produkte mit Visual Studio & TFS 2010.
| Basel Developing apps for SharePoint 2013 using Visual Studio 2013 René Modery, Office 365 MVP, 1stQuad Solutions.
Frank Fischer + Bernhard Frank Microsoft Deutschland GmbH.
3/28/2017 8:11 PM Visual Studio Tools für Office { Rapid Application Development für Office } Jens Häupel Platform Strategy Manager Microsoft Deutschland.
MVVM in Windows 8 und Windows Phone 8
PresenterCompanyContact Windows Azure ASP.NET Web-Anwendungen schnell und zuverlässig bereitstellen.
XML IV: Cocoon 2.
Virtual Earth Visualisierung von Geodaten Daniel Walzenbach, Microsoft Deutschland GmbH
SharePoint FIS HandsOn – out of the Box.
Was dir Trivialbeispiele in Async and Await nicht sagen! Marcus Kimpenhaus und Martin Möllenbeck.
Making people work together! Folie 1 NEXPLORE AG Stefan von Niederhäusern Einfache Anwendung der SuisseID durch das Software Development KIT
Umzug ASP.NET-WebForms-Elemente in MVC weiterverwenden
Office Business Anwendungen mit SharePoint Fabian Moritz | MVP Office SharePoint Server.
Design Patterns Ein Muster (pattern) ist eine Idee, die sich in einem praktischen Kontext als nützlich erwiesen hat und dies auch in anderen sein wird.
Infopoint - Ruby on Rails - Jörg Wüthrich Seite 1 Ruby on Rails Geschichte Ruby Rails Live – Demo.
Torque in Turbine Team 3 Alexander Mittermair Michael Wesinger.
Gtn gmbh Jedesmal, wenn du alle Antworten gelernt hast, wechseln sie alle Fragen. Oliver Otis Howard ( )
RateMe Slides. Ablauf Präsentation des Konzepts (5-10 min) Demonstration der laufenden Software (5-10 min) Fazit der gesammelten Erkenntnisse.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Launch ON Global.vi System ID object name classname Services to suscribe Observer Control Ref vi-path Service name Step 1 : Objects register to the Global.vi´s,
TDD mit MSTest Stefan Lieser Web:
TDD mit MSTest Stefan Lieser
Stefan Lieser Web:
Stefan Lieser Web:
TDD mit MSTest Stefan Lieser Web:
 Präsentation transkript:

ASP.NET MVC Stefan Lieser Web:

WAS IST LEGACY CODE?

Code ohne Tests ist Legacy Code

Michael Feathers Code without tests is bad code. It doesn't matter how well written it is; it doesn't matter how pretty or object-oriented or well-encapsulated it is. With tests, we can change the behavior of our code quickly and verifiably. Without them, we really don't know if our code is getting better or worse.

Agenda Einführung MVC Pattern Routing Dependency Injection Tests Controller, View, Routing

Einführung Ziele Funktionsweise Was ändert sich gegenüber WebForms?

Einführung Erste Präsentation durch Scott Guthrie ALT.NET Conference Oktober 2007 Austin Bisher CTP1, CTP2, Source Drop, sozusagen pre-CTP3

Ziele Testability Interfaces, abstract base classes (Mock Objects) Designed with TDD in mind Extensibility Keine sealed classes Pluggability z.B. Austausch der ViewEngine

Einführung Map URL to Class Front Controller

Einführung Basierend auf ASP.NET Standard ViewEngine verwendet.aspx, MasterPages und CSS Kein PostBack Kein ViewState Kein WebForms Keine UserControls Kein ASP.NET AJAX

Auf Wiedersehen

Ok, jetzt gehts los

Verwendete Komponenten ASP.NET MVC (Microsoft) MVCContrib (Community) Castle Windsor

Verwendete Komponenten Rhino.Mocks NUnit ReSharper er/ReSharper+4.0+Nightly+Builds er/ReSharper+4.0+Nightly+Builds

Model View Controller und andere Patterns

Model View Controller Ziele Entkopplung Separation of concerns Single responsibility principle Model: enthält die Daten View: präsentiert die Daten Controller: vermittelt zwischen Model und View

Abgrenzung zu MVP MVP geht weiter als MVC MVC Model: nicht zwangsläufig ein Business Domain Modell sondern häufig ein Application Modell

MVC Varianten Front Controller Supervising Controller Passive View

Routing Wie wird eine URL interpretiert?

Routing ASP.NET WebForms

Routing ASP.NET MVC public class ShopController : Controller { public RenderViewResult Artikel(string id) { Artikel artikel = repository.Get(id); return RenderView("Artikel", artikel); }

Der Unterschied ASP.NET WebForms View first ASP.NET MVC Controller first

Routing ASP.NET MVC Keine fixe Zuordnung von URL zu Verzeichnissen und Dateien Stattdessen bestimmen Routingregeln wie eine URL auf Controller und Action abgebildet wird. Routing Tabelle wird in Global.asax initialisiert. System.Web.Routing ist Bestandteil des.NET Framework 3.5 SP1

Routing Map routes.MapRoute( "Default", "{controller}/{action}/{id}, new { controller = "Home", action = "Index", id = "" }, new { controller } ); Name URL mit Parametern Parameter Defaults Parameter Constraints

Controller, Action und Parameter {controller}/{action}/{id} URL -> Routing -> Controller.Action(…) /Backlog/Item/5 public class BacklogController : Controller { public RenderViewResult Item(string id) { BacklogItem item = repository.Get(id); return RenderView("Item", item); }

Routing /Blogs BlogsController.List("Lieser", " ", "") /Blogs/Meier/ /ein-artikel BlogsController.List("Meier", " ", "") routes.MapRoute( "Blogs", "Blogs/{username}/{date}/{article}", new { controller = "Blogs", action="List", username = "Lieser", date = " ", article = "" } );

Routing Signatur MapRoute: (string name, string url, object defaults, object constraints) Warum sind defaults und constraints vom Typ object ? Parameter!! Beachte den anonymen Typ! new { controller = "…", action = "…", myParameter = "42" } controller und action müssen vorhanden sein, sonst Laufzeitfehler.

Routing Demo Ändern der Routing Map BlogsController

Routing rückwärts Erzeugen einer URL aus Controller und Action: Erzeugt die URL /Backlog/Add gemäß der Routingregel DRY – Dont repeat yourself Refactoring Intellisense ( a => a.Add(), "Hinzufügen")%>

Controller

Implementiert IController Alle public methods sind Actions [NonAction] verhindert das Jede Action liefert ein ActionResult zurück Das ActionResult bestimmt was als nächstes passiert

Vom Controller zum View Controller Action liefert ein ActionResult ExecuteResult(ControllerContext context) wird aufgerufen und rendert den View. public BacklogController : Controller { public ActionResult Index() { return RenderView("Index"); }

RenderView Verzeichnisstruktur bei RenderViewResult

ViewData ViewPage Property ViewData vom Typ T ViewPage ViewData vom Typ System.Web.Mvc.ViewData Dictionary: ViewData["Artikel"] = artikel

ViewData verwenden Backlog Item Id: Name: public BacklogController : Controller { public ActionResult Index() { BacklogItem backlogItem = … return RenderView("Index", backlogItem); }

Vom View zum Controller

Form Führt zu folgendem Methodenaufruf: BacklogController.Save(string name) <input type="text" name="name" id="name value=" " /> <input type="submit" value="Ok" name="submit id="submit" />

Form mit Html Helper

Tests Model Routing Controller View

Routing Tests GetHttpContext ist eine Helper Methode (siehe Demo) using (mocks.Record()) { context = GetHttpContext(mocks, "~/Backlog/List"); } using (mocks.Playback()) { RouteData routeData = routes.GetRouteData(context); Assert.That(routeData.Values["Controller"], Is.EqualTo("Backlog")); Assert.That(routeData.Values["Action"], Is.EqualTo("List")); }

Controller Tests ActionResult der Actions können gut getestet werden RenderViewResult renderViewResult = backlogController.List(); Assert.That(renderViewResult.ViewName, Is.EqualTo("List")); Assert.That(renderViewResult.ViewData, Is.TypeOf(typeof(BacklogViewData))); Assert.That(((IViewData)renderViewResult.ViewData).ErrorMessage, Is.EqualTo(expectedErrorMessage));

View Tests Im View steckt Code! -> Unit Tests ASP.NET Engine erforderlich um einen View zu rendern Bislang keine explizite Unterstützung für View Tests Integrationstest z.B. mit WatiN möglich

Alternative View Engines Im MVCContrib Projekt: Brail NVelocity NHaml Xslt

Dependency Injection

Controller benötigt Repository public class BacklogController : Controller { private IRepository m_Repository; public BacklogController(IRepository repository) { m_Repsitory = repository; } public RenderViewResult Show(string id) { Backlog backlog = m_Repository.Get(id); return RenderViewResult("Show", backlog); }

Dependency Injection (DI) ASP.NET MVC unterstützt den Einsatz beliebiger IoC Container zur Dependency Injection. Vorteil der Dependency Injection: die Konstruktoren der Controller können Parameter erhalten um darüber die Abhängigkeiten zu definieren. ControllerBuilder.Current.SetControllerFactory(...)

MvcContrib Bietet Factories für Castle Windsor StructureMap Spring.NET ObjectBuilder Unity NInject

DI am Beispiel Castle Windsor Zusätzliche Referenzen: Castle.Core.dll Castle.MicroKernel.dll Castle.Windsor.dll MvcContrib.Castle.dll Castle MVCContrib

DI am Beispiel Castle Windsor protected virtual void InitializeWindsor() { if (m_Container == null) { m_Container = new WindsorContainer(); m_Container.AddComponentWithLifestyle( "repository", typeof(IRepository<>), typeof(Repository<>), LifestyleType.Transient); m_Container.RegisterControllers( Assembly.GetExecutingAssembly()); ControllerBuilder.Current.SetControllerFactory( typeof(WindsorControllerFactory)); }

Fragen? Blog:

Links Michael Feathers, Working Effectively With Legacy Code

Vielen Dank!