Dieser Artikel wurde maschinell übersetzt.

NoSQL-Dokumentendatenbank

Einbetten von RavenDB in eine ASP.NET MVC 3-Anwendung

Justin Schwartzenberger

Aufmerksamkeit auf die NoSQL Bewegung wächst innerhalb von Microsoft.NET Framework-Gemeinschaft, weiterhin zu hören, Unternehmen, Teilen ihre Erfahrungen bei der Implementierung von it in Anwendungen, die wir kennen und verwenden.Mit diesem Bewusstsein kommt die Neugier, beschäftigen, und ermitteln, wie ein Datenspeicher NoSQL bereitstellen konnte, Leistungen oder andere möglichen Lösungen für die Software, die Entwickler derzeit Handwerk sind noch erhöht.Aber wo Sie Start- und wie schwer die Lernkurve ist?Vielleicht ein noch relevanter Faktor: wie viel Zeit und Mühe verpflichtet sind, starten Sie eine neue Daten-Storage-Lösung und mit dem Schreiben von Code beginnen?Schließlich müssen Sie den Installationsvorgang von SQL Server für eine neue Anwendung zu einer Wissenschaft, die richtige?

Word hat erreicht die.NET-Community im Flug eine Raven über eine neue Option für eine NoSQL-Typ Datenschicht Implementierung.RavenDB (ravendb.net) wurde eine Datenbank für die.NET-Windows-Plattform, alles, was Sie brauchen den Beginn der Arbeit mit einem nicht relationale Datenspeicher verpackt.RavenDB speichert Dokumente als Schema-Less JSON.Eine RESTful-API für die direkte Interaktion mit dem Datenspeicher vorhanden ist, aber die wahre Vorteil liegt in der.NET-Client-API, die kommt gebündelt mit der Installation.Implementiert das Muster Einheit arbeiten, und nutzt die LINQ-Syntax, um die Arbeit mit Dokumenten und Abfragen.Wenn Sie mit einem objektrelationalen Mapper (ORM) gearbeitet haben – wie das Entity Framework (EF) oder NHibernate – oder einen WCF-Dienst Daten verbraucht, Sie zu Hause mit der Architektur der API für die Arbeit mit Dokumenten in RavenDB fühlen.

Die Lernkurve für das Einrichten und ausführen, die mit einer Instanz von RavenDB ist kurz und bündig.In der Tat, die Figuren, die die Planung erfordern, ist die Lizenzierung Strategie (aber auch das ist minimal).RavenDB bietet eine open-Source-Lizenz für Projekte, die auch open Source, sondern ist eine kommerzielle Lizenz für kommerzielle closed-Source-Projekte erforderlich.Informationen über die Lizenz und die Preise finden Sie unter Ravendb.NET/Lizenzierung.Die Website besagt, dass freie Lizenzierung für Startup-Unternehmen oder diejenigen, die es in einem nicht-kommerziellen closed Source-Projekt verwenden.In jedem Fall lohnt es sich, besprechen Sie kurz die Optionen zu verstehen, die langfristige Verwirklichung potenzielle vor jeder Entwicklung von Prototypen oder Sandbox.

Embedded RavenDB und MVC

RavenDB kann in drei verschiedenen Modi ausgeführt werden:

  1. Als Windows-Dienst
  2. Als IIS-Anwendung
  3. Eingebettet in ein.NET-Anwendung

Die ersten beiden haben einen ziemlich einfache Setup-Prozess, jedoch mit geringem Overhead Strategie Implementierung kommen.Die dritte Option, eingebettet ist, ist extrem einfach zu laufen zu bringen.In der Tat ist ein NuGet-Paket für das Laufwerk verfügbar.Ein Aufruf an den folgenden Befehl in der Konsole Paket-Manager in Visual Studio 2010 (oder eine Suche nach dem Begriff "Ravendb", klicken Sie im Dialogfeld NuGet-Pakete verwalten) liefern alle Verweise, die den Beginn der Arbeit mit der embedded-Version des RavenDB benötigt:

Install-Package RavenDB-Embedded

Informationen über das Paket finden Sie auf der NuGet-Katalog-Website unter bit.ly/ns64W1.

Hinzufügen der embedded-Version des RavenDB zu einer ASP.NET MVC-3-Anwendung ist so einfach wie das Paket über NuGet hinzufügen, und geben den Datenspeicher-Dateien ein Verzeichnis. Da ASP.NET-Anwendungen haben einen bekannten Datenverzeichnis im Rahmen mit dem Namen App_Data, und die meisten hosting-Unternehmen bieten Lese-/Schreibzugriff auf dieses Verzeichnis mit wenig oder gar keine Konfiguration erforderlich, es ist ein guter Ort zum Speichern der Daten. Wenn RavenDB Speicherung von Dateien erstellt, erstellt er eine Handvoll von Verzeichnissen und Dateien in den Pfad des Verzeichnisses bereitgestellt werden. Es wird nicht erstellen Sie ein Verzeichnis auf oberster Ebene, um alles zu speichern. Zu wissen, dass, lohnt es sich, den ASP.NET-Ordner mit dem Namen App_Data via Visual Studio 2010 im Kontext des Projekts, und erstellen Sie ein Unterverzeichnis im Verzeichnis App_Data für die RavenDB-Daten (finden Sie unter Abbildung 1).

App_Data Directory Structure
Abbildung 1 App_Data-Verzeichnis-Struktur

Ein Datenspeicher des Dokuments ist Schema weniger von der Natur, daher besteht keine Notwendigkeit, erstellen Sie eine Instanz einer Datenbank oder alle Tabellen eingerichtet. Sobald der erste Aufruf zum Initialisieren des Datenspeichers im Code vorgenommen wurde, werden die Dateien benötigt, um den Datenstatus der beizubehalten, erstellt werden.

Arbeiten mit der RavenDB-Client-API für die Schnittstelle mit dem Datenspeicher benötigt eine Instanz eines Objekts, das implementiert die Schnittstelle "Raven.Client.IDocumentStore" erstellt und initialisiert werden. Die API verfügt über zwei Klassen zur Verfügung, DocumentStore und EmbeddedDocumentStore, die die Schnittstelle implementieren, und können verwendet werden, abhängig vom Modus, in dem RavenDB ausgeführt wird. Es sollte nur eine Instanz pro Datenspeicher während des Lebenszyklus einer Anwendung vorhanden sein. Kann ich eine Klasse zum Verwalten von einer einzigen Verbindungs mit meinem Dokumentenspeicher, mit denen ich die auf die Instanz des Objekts IDocumentStore über eine statische Eigenschaft zugreifen und verfügen über eine statische Methode zum Initialisieren der Instanz erstellen (siehe Abbildung 2).

Abbildung 2-Klasse für DocumentStore

public class DataDocumentStore
{
  private static IDocumentStore instance;
 
  public static IDocumentStore Instance
  {
    get
    {
      if(instance == null)
        throw new InvalidOperationException(
          "IDocumentStore has not been initialized.");
      return instance;
    }
  }
 
  public static IDocumentStore Initialize()
  {
    instance = new EmbeddableDocumentStore { ConnectionStringName = "RavenDB" };
    instance.Conventions.IdentityPartsSeparator = "-";
    instance.Initialize();
    return instance;
  }
}

Überprüft der Getter für eine statische Eigenschaft, ein private statische dahinter liegende Feld für ein null-Objekt, und wenn dieser Wert null ist, löst eine InvalidOperationException aus. Ich werfen hier eine Ausnahme, anstatt die Initialize-Methode, um den Code threadsicher bleibt. Wenn die Instanzeigenschaft sorgen, dass der Aufruf und die Anwendung verweisen auf die Eigenschaft, um die Initialisierung ausführen verlassen durften, würde dann es eine Chance, dass mehr als ein Benutzer die Anwendung zum gleichen Zeitpunkt treffen könnte die gleichzeitige Aufrufe an die Initialize-Methode. Innerhalb der Initialize-Methode Logik ich erstellen eine neue Instanz der Raven.Client.Embedded.EmbeddableDocumentStore und legen die ConnectionStringName-Eigenschaft auf den Namen einer Verbindungszeichenfolge, die durch die Installation des Pakets RavenDB NuGet in der Datei web.config hinzugefügt wurde. In der Datei web.config festlegen ich den Wert der Verbindungszeichenfolge, um eine Syntax, die RavenDB zu konfigurieren, um die eingebettete lokale Version des Datenspeichers verwenden versteht. Ich ordnen Sie das Dateiverzeichnis in das Datenbank-Verzeichnis im Verzeichnis App_Data der MVC-Projekt erstellte:

<connectionStrings>
  <add name="RavenDB " connectionString="DataDir = ~\App_Data\Database" />
</connectionStrings>

Die IDocumentStore-Schnittstelle enthält alle Methoden für die Arbeit mit dem Datenspeicher. Zurückzukehren, und speichern das EmbeddableDocumentStore-Objekt als Instanz des Schnittstellentyps IDocumentStore, so habe ich die Flexibilität die Instanziierung des Objekts EmbeddedDocumentStore auf die Serverversion (DocumentStore) zu ändern wollen, die eingebettete Version zu entfernen. Auf diese Weise werden alle mein Code für die Geschäftslogik, der meine Dokumenten-Management-Objekt behandelt wird von den Kenntnissen der Modus entkoppelt werden in denen RavenDB ausgeführt wird.

RavenDB wird die Dokument-ID-Schlüssel in einem REST-ähnlichen Format standardmäßig erstellt. Ein Objekt "Item" erhalten einen Schlüssel im Format "Elemente/104." Der Modellname des Objekts wird in Kleinbuchstaben konvertiert und ist pluralisiert, und eine eindeutige Identität Nachverfolgungsnummer nach einem Schrägstrich mit jeder neuen Dokumenterstellung angehängt ist. Dies kann in einer MVC-Anwendung problematisch sein, da der Schrägstrich einen neuen Routenparameter, der zu analysierende verursachen wird. Die RavenDB-Client-API bietet eine Möglichkeit, den Schrägstrich zu ändern, indem Sie den Wert IdentityPartsSeparator. In meiner Methode DataDocumentStore.Initialize bin ich den Wert IdentityPartsSeparator zu einem Bindestrich vor dem Aufruf von Initialize-Methode für das EmbeddableDocumentStore-Objekt, um das routing-Problem zu vermeiden.

Einen Aufruf an die statische DataDocumentStore.Initialize-Methode aus der Application_Start-Methode in der Datei Global.asax.cs meiner MVC-Anwendung hinzufügen wird die IDocumentStore-Instanz, bei der ersten Ausführung der Anwendung einrichten, die wie folgt aussieht:

protected void Application_Start()
{
  AreaRegistration.RegisterAllAreas();
  RegisterGlobalFilters(GlobalFilters.Filters);
  RegisterRoutes(RouteTable.Routes);
 
  DataDocumentStore.Initialize();
}

Von hier aus kann ich machen, verwenden die IDocumentStore-Objekt mit einer statischen Aufruf der DataDocumentStore.Instance-Eigenschaft Document-Objekte von meinem Shop eingebettete Daten innerhalb meiner MVC-Anwendung arbeiten.

RavenDB Objekte

Um ein besseres Verständnis des RavenDB in Aktion zu erhalten, werde ich einen Prototyp zum Speichern und Verwalten von Lesezeichen erstellen. RavenDB zur Arbeit mit Plain Old CLR-Objekte (POCOs), so es keine Notwendigkeit gibt, die Serialisierung steuern die Eigenschaftsattribute hinzufügen. Erstellen einer Klasse zum Darstellen einer Textmarke ist ziemlich einfach. Abbildung 3 zeigt die Lesezeichen-Klasse.

Abbildung 3-Bookmark-Klasse

public class Bookmark
{
  public string Id { get; set; }
  public string Title { get; set; }
  public string Url { get; set; }
  public string Description { get; set; }
  public List<string> Tags { get; set; }
  public DateTime DateCreated { get; set; }
 
  public Bookmark()
  {
    this.Tags = new List<string>();
  }
}

RavenDB serialisieren die Daten des Objekts in eine JSON-Struktur, wenn es geht um das Dokument zu speichern. Die bekannte "Id" der benannten Eigenschaft wird verwendet, behandeln die Dokument-ID-Taste. RavenDB wird dieser Wert erstellt – vorausgesetzt, die ID-Eigenschaft leer oder null ist, wenn den Aufruf zum Erstellen des neuen Dokuments zu machen – und speichert es in einem @ Metadaten-Element für das Dokument (die zum Behandeln der Dokument-Taste auf der Ebene der Datenspeicher verwendet wird). Beim Anfordern eines Dokuments wird der RavenDB-Client-API-Code die Dokument-ID-Taste auf die Id-Eigenschaft festgelegt, beim Laden des Document-Objekts.

Die JSON-Serialisierung ein Bookmark-Beispieldokument wird in der folgenden Struktur dargestellt:

{
  "Title": "The RavenDB site",
  "Url": "http://www.ravendb.
net",
  "Description": "A test bookmark",
  "Tags": ["mvc","ravendb"],
  "DateCreated": "2011-08-04T00:50:40.3207693Z"
}

Bookmark-Klasse wird mit den Dokumentenspeicher vorbereitet wird, aber die Tags-Eigenschaft in der UI-Ebene eine Herausforderung darstellen. Ich möchte, damit der Benutzer, geben Sie eine Liste der Tags in einem einzigen Feld Texteingabefeld durch Kommata getrennt und haben der MVC-modelbinder alle Datenfelder ohne Logik Code sickern in Meine Ansichten oder Controller-Aktionen zuordnen. Ich kann dieses Problem anzugehen, mithilfe eines benutzerdefinierten Modell Binders für die Zuordnung von einem Formularfeld mit dem Namen "TagsAsString" in das Feld Bookmark.Tags. Ich erstellen Sie zunächst die benutzerdefinierten Binder Modellklasse (finden Sie unter Abbildung 4).

Abbildung 4 BookmarkModelBinder.cs

public class BookmarkModelBinder : DefaultModelBinder
{
  protected override void OnModelUpdated(ControllerContext controllerContext,
    ModelBindingContext bindingContext)
  {
    var form = controllerContext.HttpContext.Request.Form;
    var tagsAsString = form["TagsAsString"];
    var bookmark = bindingContext.Model as Bookmark;
    bookmark.Tags = string.IsNullOrEmpty(tagsAsString)
      ?
new List<string>()
      : tagsAsString.Split(',').Select(i => i.Trim()).ToList();
  }
}

Dann aktualisieren kann ich die Datei Globals.asax.cs, das Modell Sammelmappen beim Starten der Anwendung der BookmarkModelBinder hinzu:

protected void Application_Start()
{
  AreaRegistration.RegisterAllAreas();
  RegisterGlobalFilters(GlobalFilters.Filters);
  RegisterRoutes(RouteTable.Routes);
 
  ModelBinders.Binders.Add(typeof(Bookmark), new BookmarkModelBinder());
  DataDocumentStore.Initialize();
}

Zum Auffüllen des HTML-Textfeldes mit den aktuellen Tags im Modell zu behandeln, werde ich eine Erweiterungsmethode, konvertieren Sie eine Liste <string> hinzufügen. Objekt in eine durch Kommas getrennte Zeichenfolge:

public static string ToCommaSeparatedString(this List<string> list)
{
  return list == null ?
string.Empty : string.Join(", ", list);
}

Arbeitseinheit

Die RavenDB-Client-API basiert auf dem Unit of Work-Muster. Um Dokumente aus dem Datenspeicher des Dokuments zu arbeiten, muss eine neue Sitzung geöffnet werden; Arbeit muss getan und gespeichert werden; und die Sitzung muss beendet werden. Die Sitzung behandelt die Änderungsnachverfolgung und arbeitet in einer Weise, die einen Datenkontext in der EF ähnlich ist. Hier ist ein Beispiel für ein neues Dokument zu erstellen:

using (var session = documentStore.OpenSession())
{
  session.Store(bookmark);
  session.SaveChanges();
}

Es ist optimal, um die Sitzung während der HTTP-Anforderung live, damit Änderungen, die Verwendung der First-Level-Cache und So weiter verwaltet werden können. Ich erstelle einen base-Controller, die die DocumentDataStore.Instance verwendet wird, öffnen Sie eine neue Sitzung auf Aktion ausführen, und klicken Sie auf Aktion ausgeführt werden die Änderungen speichern und dann des Sitzungsobjekts verfügen (finden Sie unter Abbildung 5). Dies ermöglicht es mir die Arbeit, die gewünscht wird, während der Ausführung von Mein Code für die Aktion mit einer Instanz des einzigen geöffneten Sitzung zu tun.

Abbildung 5 BaseDocumentStoreController

public class BaseDocumentStoreController : Controller
{
  public IDocumentSession DocumentSession { get; set; }
 
  protected override void OnActionExecuting(ActionExecutingContext filterContext)
  {
    if (filterContext.IsChildAction)
      return;
    this.DocumentSession = DataDocumentStore.Instance.OpenSession();
    base.OnActionExecuting(filterContext);
  }
 
  protected override void OnActionExecuted(ActionExecutedContext filterContext)
  {
    if (filterContext.IsChildAction)
      return;
    if (this.DocumentSession != null && filterContext.Exception == null)
      this.DocumentSession.SaveChanges();
    this.DocumentSession.Dispose();
    base.OnActionExecuted(filterContext);
  }
}

MVC-Controller und Ansichtsimplementierung

Die BookmarksController-Aktionen arbeiten direkt mit dem IDocumentSession-Objekt aus der Basisklasse und alle Vorgänge erstellen, lesen, aktualisieren und löschen (CRUD) für die Dokumente zu verwalten. Abbildung 6 zeigt den Code für die Lesezeichen-Controller.

Abbildung 6 BookmarksController-Klasse

public class BookmarksController : BaseDocumentStoreController
{
  public ViewResult Index()
  {
    var model = this.DocumentSession.Query<Bookmark>()
      .OrderByDescending(i => i.DateCreated)
      .ToList();
    return View(model);
  }
 
  public ViewResult Details(string id)
  {
    var model = this.DocumentSession.Load<Bookmark>(id);
    return View(model);
  }
 
  public ActionResult Create()
  {
    var model = new Bookmark();
    return View(model);
  }
 
  [HttpPost]
  public ActionResult Create(Bookmark bookmark)
  {
    bookmark.DateCreated = DateTime.UtcNow;
    this.DocumentSession.Store(bookmark);
    return RedirectToAction("Index");
  }
   
  public ActionResult Edit(string id)
  {
    var model = this.DocumentSession.Load<Bookmark>(id);
    return View(model);
  }
 
  [HttpPost]
  public ActionResult Edit(Bookmark bookmark)
  {
    this.DocumentSession.Store(bookmark);
    return RedirectToAction("Index");
  }
 
  public ActionResult Delete(string id)
  {
    var model = this.DocumentSession.Load<Bookmark>(id);
    return View(model);
  }
 
  [HttpPost, ActionName("Delete")]
  public ActionResult DeleteConfirmed(string id)
  {
    this.DocumentSession.Advanced.DatabaseCommands.Delete(id, null);
    return RedirectToAction("Index");
  }
}

IDocumentSession.Query-<T> wie die Methode den Index gibt ein resultatobjekt, das die IEnumerable-Schnittstelle implementiert, so dass ich den OrderByDescending-LINQ-Ausdruck verwenden, um die Elemente sortieren, und rufen Sie die ToList-Methode, um die Daten in meinem Rückgabeobjekt aufzeichnen. Die IDocumentSession.Load-Methode in der Aktion Informationen nimmt einen Schlüsselwert für die Dokument-ID und Deserialisierung das entsprechende Dokument auf ein Objekt vom Typ Lesezeichen.

Die Create-Methode mit dem HttpPost Verb-Attribut legt die CreateDate-Eigenschaft auf die Lesezeichen-Elements und ruft die IDocumentSession.Store-Methode aus der Session-Objekt die Dokumentenspeicher einen neuen Datensatz hinzu. Die Update-Methode mit dem Verb HttpPost kann als auch die IDocumentSession.Store-Methode aufrufen, da das Bookmark-Objekt den Id-Wert bereits festgelegt. RavenDB erkennt, dass die Id und die vorhandene Update mit dem passenden Schlüssel zu, stattdessen dokumentieren eine neue erstellen. Die DeleteConfirmed Aktion ruft eine Delete-Methode von der IDocumentSession.Advanced.DatabaseCommands-Objekt, das bietet eine Möglichkeit, ein Dokument durch Schlüssel zu löschen, ohne zuerst das Objekt zu laden. Ich brauche zu die IDocumentSession.SaveChanges-Methode in einer dieser Aktionen aufrufen, denn ich habe den Basis-Controller dieser Anruf auf Aktion.

Alle Ansichten sind relativ unkompliziert. Sie können stark der Lesezeichen-Klasse in die Markierungen erstellen, bearbeiten und löschen und eine Liste der Lesezeichen im Markup Index eingegeben werden. Jede Ansicht kann die Modelleigenschaften für die Anzeige und Eingabefelder direkt verweisen. Der einzige Ort, wo ich Object-Eigenschaftsverweis abhängig muss werde, ist mit dem Eingabefeld für die Tags. Ich verwende die ToCommaSeparatedString-Erweiterungsmethode in den Ansichten erstellen und bearbeiten, mit dem folgenden Code:

@Html.TextBox("TagsAsString", Model.Tags.ToCommaSeparatedString())

Dadurch wird den Benutzer zum eingeben und bearbeiten die Tags, die das Lesezeichen in einer durch Trennzeichen getrennten Format innerhalb eines einzelnen Textfeldes zugeordnet.

Objekte suchen

Mit allen meinen CRUD-Operationen an Stelle ich meine Aufmerksamkeit auf eine letzte Anmerkung Funktionalität hinzufügen aktivieren können: die Fähigkeit zum Filtern der Liste Textmarke durch Tags. Zusätzlich zu die IEnumerable-Schnittstelle implementiert, implementiert das Rückgabeobjekt aus der IDocumentSession.Query-Methode auch die IOrderedQueryable und IQueryable-Schnittstellen aus der.NET Framework. Dies ermöglicht LINQ Filtern und sortieren eigene Abfragen verwenden. Hier ist z. B. eine Abfrage der in den letzten fünf Tagen erstellten Lesezeichen:

var bookmarks = session.Query<Bookmark>()
  .Where( i=> i.DateCreated >= DateTime.UtcNow.AddDays(-5))
  .OrderByDescending(i => i.DateCreated)
  .ToList();

Hier ist eine Seite über die vollständige Liste der Lesezeichen:

var bookmarks = session.Query<Bookmark>()
  .OrderByDescending(i => i.DateCreated)
  .Skip(pageCount * (pageNumber – 1))
  .Take(pageCount)
  .ToList();

RavenDB erstellen Sie dynamische Indizes, die auf Grundlage der Ausführung dieser Abfragen, die für eine "gewisse Zeit" bestehen bleibt, bevor Sie gerade freigegeben. Wenn eine ähnliche Abfrage mit der gleichen Parameterstruktur für die erneut ausführen wird, wird der temporäre Index zu dynamische verwendet werden. Wenn der Index verwendet, ist genügend innerhalb eines bestimmten Zeitraums, der Index vorgenommen werden permanent. Diese werden über den Lebenszyklus der Anwendung beibehalten.

Meine BookmarksController-Klasse, um immer Lesezeichen nach Tag verarbeiten können die folgende Aktionsmethode hinzufügen:

public ViewResult Tag(string tag)
{
  var model = new BookmarksByTagViewModel { Tag = tag };
  model.Bookmarks = this.DocumentSession.Query<Bookmark>()
    .Where(i => i.Tags.Any(t => t == tag))
    .OrderByDescending(i => i.DateCreated)
    .ToList();
  return View(model);
}

Ich erwarte, dass dieser Vorgang in regelmäßigen Abständen von Benutzern des Antrags getroffen werden.Wenn dies tatsächlich der Fall ist, wird diese dynamische Abfrage in einen permanenten Index von RavenDB ohne zusätzlichen Aufwand für meinen Teil erforderlich aktiviert zu erhalten.

Ein Raven gesendet, um uns zu wecken.

Mit dem Aufkommen von RavenDB die.NET-Community wird angezeigt, endlich haben eine NoSQL Dokument Speichertyp Lösung gesorgt, gegenüber dem Microsoft-zentrierten Geschäfte und Entwicklern, die durch die Welt nicht relationale Gleiten, die so viele andere Frameworks und Sprachen für den letzten Jahren Navigation wurde.Wir werden nie mehr die rufe ein Mangel an nicht relationale Liebe für den Microsoft-Stack hören.RavenDB macht es einfach für.NET-Entwickler zu spielen und Prototyping mit einem nicht relationale Datenspeicher durch die Bündelung der Installations mit einem sauberen Client-API, das Daten-Management-Techniken nachahmt, die Entwickler bereits beschäftigt sind.Während das mehrjährige Argument zwischen relationalen und nicht relationalen sicher aus der einfachen ausprobieren sterben wird nicht sollte etwas "Neues" helfen, führen zu einem besseren Verständnis des wie und wo eine nicht relationale Lösung innerhalb einer Anwendungsarchitektur passen.

Justin SchwartzenbergerHat CTO bei DealerHosts, verankert wurden in die Entwicklung von Webanwendungen für eine ganze Weile, durchlaufen die syntaktische Dschungel von PHP, klassischen ASP, Visual Basic, VB.NET und ASP.NET-Web Forms.Als ein early Adopter von ASP.NET MVC im Jahr 2007, beschloss er seine Web-Stack-Focus alles, was MVC umgestaltet werden kann.Er trägt dazu bei mit Artikeln, spricht auf Usergroup Treffen. Twitter: twitter.com/schwarty.

Dank der folgenden technischen Experten für die Überprüfung dieses Artikels: Ayende Rahien