Inside-Informationen über Pokefans: was bei uns so unter der Haube läuft. Kurioses, Interessantes oder auch einfach nur Einblicke in das, was wir so den lieben langen Tag machen.

Zum Inhalt | Zum Menü | Zur Suche

Und los geht's!

Vor knapp einer Woche haben wir euch die Anfänge vom neuen Pokefans vorgestellt. Einige haben sich das auch schon angesehen und haben nachgefragt. Daher möchte ich diesen Blogpost mal nutzen, um auf ein paar Fragen einzugehen.

Q: Warum C? Ich habe gehört, dass das viel schwieriger sein soll als Java/PHP/<insert sprache deiner Wahl hier>

A: Nun, C ist in der Tat schwerer. Aber wir verwenden ja auch C#, nicht C. C# ähnelt mehr Java als C, mit dem Unterschied, dass die Standardbibliothek wesentlich besser ist als bei Java. Das ist sozusagen die Gunst der späten Stunde; Java gibt es auch schon um einiges länger als C#.

Q: Visual Studio 2013 läuft bei mir nicht!!!11

A: Du benötigst mindestens Windows 7 SP1 oder neuer, um mit Visual Studio zu arbeiten. Keine Sorge: um bei uns mitzuentwickeln muss niemand Geld ausgeben. Du kannst einfach eine der vielen Linux-Distributionen nehmen und mit MonoDevelop arbeiten. Das geht genauso! Und Linux ist sowieso das bessere Betriebssystem ;-)

Q: Mono gibt mir eine MissingMethodException - was ist das?

A: Dein Mono ist wahrscheinlich einfach zu alt. Damit alles läuft, brauchst du ein Bleeding-Edge-Mono (in Wahrheit wurde nämlich mein Pull-Request, der Mono patcht, sodass alles läuft erst heute, 9.6.2015 gemerged, kann also sein, dass es noch etwas dauert, bis du das in deinem Repository hast).

Q: Gott sind das viele Dateien. Wo fang' ich denn da an?

A: Weiterlesen!

Einen Einstieg ins Repository finden

Wahrscheinlich haben viele von euch noch nie ein Projekt dieser Größe gesehen. Daher will ich mal zusammenfassen was wo ist. Das ist wahrscheinlich nicht immer ganz korrekt, gibt aber einen Überblick darüber, wie wir uns das vorstellen.

Generell gibt es erstmal fünf Projekte. Cache, Security, Data, Util und Pokefans. Doch was tun die genau?

  • Data ist unser Datenabstraktionslayer. Hier befinden sich die CodeFirst-Klassen von Entity Framework. Mehr Infos dazu gibt's z.B. hier.
  • Cache ist eine Sammlung von verschiedenen Caching-Backends. Das ist sogar in einem recht fertigen Zustand - danke an dieser Stelle an Birne94, von dem die Implementation stammt.
  • Security beherbergt alles, was mit Benutzerauthentifizierung und Berechtigungsprüfung zu tun hat. Insbesondere die OWIN-Provider. Kann man auch soweit fertig nennen.
  • Util ist eine Sammlung von verschiedenen Klassen, die als "Helfer" für das Pokefans-Projekt fungieren. Wer hier was rein tut, sollte sich i.d.R. sicher sein, dass da auch rein gehört - aka: wir werden genau kontrollieren, was da drin landet. Bis jetzt ist das u.A. ein Breadcrumb-Helper sowie eine angepasste Seiten-Basisklasse, die mehr Eigenschaften hat als die Standardklasse. Unter anderem stellen wir damit den derzeit aktiven Benutzer zur Verfügung.
  • Pokefans ist das eigentliche MVC5-Projekt. Darin ist dann die gesamte Webseite gebaut.

MVC steht für Model-View-Controller, ein Designpattern, das bei Webanwendungen sehr beliebt ist. Grundsätzlich trennt das damit in Datenmodelle (Data-Projekt), Controller (sozusagen eine Arbeitsschicht: hier wird festgelegt, was die Seite tut) und Ansichten (die Präsentationsschicht: Wie sieht das Ergebnis des Controllers aus?). Zusätzlich teilen wir das Ganze noch in verschiedene Bereiche auf. Diese findest du im Unterordner "Areas" des Pokefans-Projekts. Generell kannst du dir eine Area als eine Subdomain vorstellen - ein zusammenhängendes Stück, dass man auch isoliert betreiben könnte, wie den Benutzerbereich oder die Fanartgalerie.

Startbereit!

Jetzt, wo wir wissen, wie das Repository aufgebaut ist, können wir doch einfach mal eine Seite hinzufügen. Weil ich von Praxisfernen Beispielen nichts halte und meine Arbeitszeit wertvoll ist, habe ich gleich etwas gemacht, was ich sowieso grade brauche: Eine Startseite für den Mitarbeitsbereich.

Wo arbeiten wir also? Der Mitarbeitsbereich hat eine eigene Subdomain: mitarbeit.pokefans.net. Wir haben also eine eigene Area mitarbeit. Dort gibt's mal grundsätzlich drei Ordner:

  • Controllers
  • Models
  • Views

In den meisten Fällen wirst du den Models-Ordner nicht brauchen. Falls doch, bedenke, dass die Klassen die sich da drin befinden nicht direkt in der Datenbank gespeichert werden können. In diesem Beispiel können wir ihn aber ignorieren, da wir erstmal nicht mit Daten hantieren. Aus der vorherigen Erklärung - und hoffentlich Googlei von deiner Seite aus ;-) - von MVC wissen wir, dass eine Seite mindestens zwei Dateien braucht: einen Controller und eine View. Das ist zwar nicht ganz richtig, da eine Controlleraction auch Weiterleitugnen machen kann (dann brauche ich keine View), aber für uns reicht erstmal zu wissen, dass es zu jeder Seite einen Controller und eine View gibt.

Lass uns das noch etwas präzisieren: Jede Url in MVC wird zu einer Methode aufgelöst, die dann aufgerufen wird. Genau genommen brauchen wir also nicht einen Controller, sondern eine Controllermethode. Zusammengehörende Controllermethoden fasst man in einem Controller zusammen. Und nachdem ich dich jetzt genug mit Theorie gelangweilt habe, gibt's jetzt erstmal etwas Code. Als erstes legen wir mal unseren Controller an. Weil Programmierer faule Menschen sind, hat Visual Studio dafür schon eine schöne Klickibunti-Gui. Wer mit Monodevelop arbeitet, muss selbst Hand anlegen - ist aber nicht weiter schwer. Ein Controller ist nichts anderes als eine Klasse, die im Controllers-Ordner sitzt, und einen Namen wie DeinNameHierController.cs hat. Wichtig ist, dass das mit Controller.cs aufhört, sonst geht gar nichts. Wir legen also einen leeren Controller an und nennen ihn DashboardController.cs. Das schaut dann so aus:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Pokefans.Areas.mitarbeit.Controllers
{
    public class DashboardController : Controller
    {
        // GET: mitarbeit/Dashboard
        public ActionResult Index()
        {
            return View();
        }
    }
} 

Das ist ja schon mal super. Zwei kleine Änderungswünsche habe ich aber noch:

  1. Den Mitarbeiterbereich sollen natürlich nur Mitarbeiter betreten dürfen. Daher müssen wir noch entsprechend die Berechtigung überprüfen.
  2. Die automatische View-Auflösung funktioniert leider nicht wie gewünscht. Daher müssen wir den Pfad zur View manuell angeben.

Zu Berechtigungsprüfung können wir einfach ein Attribut für die Klasse verwenden. Über die Klasse schreiben wir also folgendes:

[Authorize(Roles="mitarbeiter")]

Und schwupps - jetzt können alle Actions (also alle Methoden in dem Controller) nur noch aufgerufen werden, wenn der aufrufende Benutzer die Rolle (oder auch: Berechtigung) "mitarbeiter" hat. Um die View explizit anzugeben, muss dann noch die Zeile 15 wie folgt angepasst werden:

           return View("~/Areas/mitarbeit/Views/Dashboard/Index.cshtml");

Da steht dann auch schon drin, wo wir unsere View anlegen müssen. Zunächst einmal legen wir für den Controller ein neues Unterverzeichnis in unserem View-Ordner an. Darin platzieren wir jetzt eine neue View-Datei (.cshtml) und nennen sie wie die dazugehörige Methode.

Ich will jetzt nicht zu sehr auf die Syntax der Views eingehen - das kann man im Web besser nachlesen. So könnte z.B. unsere View aussehen:

@{
    SiteTitle = "Mitarbeitsbereich - Dashboard";
    SiteHeader = "Dashboard";
    SiteDescription = "Deine Übersicht";
    Layout = "~/Areas/mitarbeit/Views/_Layout.cshtml";
}

<div class="panel panel-default">
    <div class="panel-heading"><h3 class="panel-title">Hallo!</h3></div>
    <div class="panel-body">
        Ich befinde mich derzeit noch im Aufbau. Schau bald wieder vorbei!
    </div>
</div>

Ein paar Sachen muss ich dazu noch festhalten:

  • Mit SiteTitle lege ich den Titel in der Seite (<title>-Tag im Head) fest.
  • SiteHeader bestimmt die erste Überschrift
  • SiteDescription einen zusätzlichen Text dazu. Das wird aber nicht überall benutzt.
  • Layout gibt eine Layout-Masterseite an. Das muss nur explizit gesetzt werden, wenn (wie im Mitarbeitsbereich) nicht das Standardlayout verwendet wird.

Ich hoffe, das hat jetzt einigen den Einstieg in das Projekt erleichtert. Demnächst steht der Code hier auch auf GitHub, wenn's soweit ist, gibt's hier ein Update.

Rock on, ~Delirium

Update: Der Code ist jetzt auf GitHub gelandet!

Kommentar eintragen

Kommentare können mit einfacher Wiki-Syntax formatiert werden.

Folgende haben zum gleichen Thema veröffentlicht

Trackback-URL : http://inside.pokefans.net/index.php?trackback/6

Die Kommentare dieses Eintrags als Atom-Feed abonnieren