Frage

Ich habe die Tutorials wurden durchlaufen (insbesondere diejenigen mit Linq-To-Entities) und ich verstehe die grundlegenden Konzepte, aber einige Dinge geben mir Fragen.

Die Übungen beinhalten in der Regel nur einfache Modelle und Formen, die nur grundlegende nutzen erstellen, aktualisieren und Aussagen löschen. Mein sind ein wenig komplizierter, und ich bin nicht sicher, ob ich über das den richtigen Weg werde, weil, wenn es darum geht, die Beziehungen von einem halben Dutzend Datenbankobjekten zu handhaben, die Tutorials aufhören zu helfen.

Für die Post-Methode, die übliche Art und Weise CRUD-Operationen durchführen

entities.AddToTableSet(myClass);
entities.SaveChanges();

Wird nicht das tun, was ich will, weil eine vollständig umgesetzt Klasse ist nicht auf die Controller-Methode geschrieben zu werden. Ich poste kann einzelne Felder, Form Sammlungen oder mehrere Objekte DTO und rufen Sie dann eine Methode für einen Service oder Repository-Informationen, die ich von einem Formular Post erhalten zu nehmen, zusammen mit Informationen, die er für abfragen muss oder selbst erstellen und dann von all diese Dinge, mein Datenbank-Objekt erstellen, dass ich sparen kann.

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Add(int id, [Bind(Exclude = "Id")] ClassA classA,
                        [Bind(Exclude = "Id")]ClassB classB)
{
   // Validation occurs here

   if(!ModelState.IsValid)
      return View();

   try
   {
      _someRepositoryOrService.Add(id, classA, classB);
      return RedirectToAction("Index", new { id = id });
   }
   catch(Exception ex)
   {
      // Logging and exception handling occurs here
   }
}


public void Add(int id, ClassA classA, ClassB classB)
{
    EntityA eA = new EntityA
    {
        // Set a bunch of properties using the two classes and
        // whatever queries are needed
    };

    EntityB eB = new EntityB
    {
        // Set a bunch of properties using the two classes and
        // whatever queries are needed
    };

    _entity.AddToEntityASet(eA);
    _entity.AddToEntityBSet(eB);
    _entity.SaveChanges();
}

Am Umgang ich das richtig oder bin ich bastardizing den Rahmen? Ich eigentlich nie direkt ein Einheit-Objekt verwenden, wenn ich für eine Abfrage ich die Informationen, die ich in einem DTO brauchen setzen und gründe meine Ansichten aus, dass. Das gleiche gilt für die Schöpfung. Ist das erlaubt, oder ist meine Vermeidung von Einheiten direkt geht gegen den Zweck der Verwendung der Framework?

Edit: Ich bin auch über diesen Ansatz besorgt, weil es leer Konstrukteurs erfordert aufgrund dieser Fehlermeldung, die LINQ-Abfragen richtig zu tun:

  

Nur parameterlos Bauer und   Initialisierungen sind in LINQ unterstützt   Entities.

Das ist kein großes Problem, da ich selten Logik int die Konstrukteure brauchen, aber das ist ein Thema, keine Konstrukteure zu haben und nur öffentliche Eigenschaften?

War es hilfreich?

Lösung

_someRepositoryOrService.Add (id, classA, classB);

Ich würde sagen, Sie Paar Ihre Repositorys mit Präsentationsschicht. Dies sollte nicht sein. Ihre Repositories sollten nur mit Einheiten arbeiten. Als nächstes feststellen, wie Ihre Add-Methode

public void Add (int id, KlasseA classA, ClassB classB)

bricht Separation of Concerns (SoC). Es führt zwei Aufgaben:

  1. Kartenansicht Daten in Einheiten
  2. Bild speichern unter Repository

Offensichtlich ist der erste Schritt soll in Präsentationsschicht erfolgen. Erwägen Sie die Verwendung Modell Bindemittel dafür. Es kann auch helfen, das Konstrukteurs-Problem zu lösen, da Ihr Modell Bindemittel bewusst die baulichen Anforderungen hergestellt werden kann.

Überprüfen Sie auch diese ausgezeichnete post von Jimmy Bogard (Co-Autor von ASP.NET MVC in Aktion) über Viewmodel. Dies könnte helfen Sie Zuordnung zu automatisieren. Es schlägt auch eine umgekehrte Technik - machen Sie Ihre Controller mit Einheiten arbeiten, nicht Viewmodel! Benutzerdefinierte Aktion Filter und Modell Bindemittel sind wirklich der Schlüssel Routine zu beseitigen, dass das wirklich nicht zu Controllern gehört, sondern eine Infrastruktur Detail zwischen View und Controller. Zum Beispiel hier 's wie ich automatisieren Einheiten retrival. Hier 's, wie ich sehe, was Controller tun sollten .

Das Ziel ist es, Controller Business-Logik zu machen contentrate auf die Verwaltung, alle technischen Details beiseite zu legen, die zu Ihrem Unternehmen gehören. Es ist techical Einschränkungen, die Sie in dieser Frage sprechen, und lassen Sie sie in Ihren Code auslaufen. Aber Sie können MVC-Tools verwenden, um die ihnen Infrastrukturebene zu bewegen.

UPDATE: Nein, Repositories sollten nicht Formulardaten verarbeiten, das ist, was ich mit „Kopplung mit Präsentation“ bedeuten. Ja, sind Repositories in der Steuerung, aber sie funktionieren nicht mit Formulardaten. Sie können (nicht, dass Sie sollten) Form der Arbeit mit „Repositories Daten“ machen - das heißt Einheiten - und das ist, was die meisten Beispiele zu tun, zum Beispiel NerdDinner - aber nicht umgekehrt. Dies ist wegen der allgemeinen Faustregel gilt: - höhere Schichten können mit niedrigerer gekoppelt werden (Präsentation gekoppelt mit Repositories und Organisationen), aber nie niedriges Niveau soll (Entitäten hängen von Repositories höher diejenigen gekoppelt werden, abhängig Repositories auf Form-Modell, etc. ).

Der erste Schritt soll im Repository durchgeführt werden, das ist richtig - außer dass Abbildung von ClassX zu EntityX gehört nicht zu diesem Schritt. Es ist Mapping Sorge - eine Infrastruktur. Siehe zum Beispiel Frage zu Mapping href="https://stackoverflow.com/questions/678217/best-practices-for-mapping-dto-to-domain-object">, aber in der Regel, wenn Sie haben zwei Schichten (UI und Repositories) sie zur Zuordnung nicht kümmern sollte - ein Mapper Service / Helfer sollte. Neben Jimmy Blog, können Sie auch ASP.NET MVC in Aktion lesen oder einfach Blick auf ihre CodeCampServer , wie sie mit IEntityMapper Schnittstellen-Controller-Konstruktoren übergeben Mapping tun (beachten sie, dass diese mehr manuelle und weniger Arbeit Ansatz ist, dass Jimmy Bogard der AutoMapper).

Eine weitere Sache. Lesen Sie mehr über Domain Driven Design, suchen Sie nach Artikeln, von ihnen lernen, aber Sie haben nicht alles zu folgen. Dies sind Richtlinien, nicht strenge Lösungen. Sehen Sie, wenn Ihr Projekt damit umgehen können, finden Sie, wenn Sie damit umgehen können, und so weiter. Versuchen Sie, diese Techniken anzuwenden, da sie sind in der Regel die ausgezeichneten und anerkannten Formen der Entwicklung zu tun, aber nehmen sie nicht blind -. Es ist besser auf dem Weg zu lernen, als etwas gelten Sie nicht verstehen,

Andere Tipps

Ich würde sagen, DTOs und Einwickeln des Entity Framework mit Ihren eigenen Datenzugriffsmethoden und Business-Schicht ist ein guter Weg zu gehen mit. Sie können eine Menge Code am Ende zu schreiben, aber es ist eine bessere Architektur als das Entity Framework generierten Code vorgibt, ist Ihre Business-Schicht.

Diese Probleme sind nicht wirklich unbedingt zu ASP.NET MVC in irgendeiner Weise gebunden. ASP.NET MVC gibt im Grunde keine Anleitung, wie Sie Ihr Modell / Datenzugriff zu tun, und die meisten Proben und Tutorials für ASP.NET MVC sind nicht die Produktion würdig Modellimplementierungen, aber wirklich nur minimal Proben.

Es scheint, wie Sie auf dem richtigen Weg sind, halten zu gehen.

Am Ende Sie Entity Framework meist als Code-Generator verwenden, das nicht sehr nützlich Code generiert und so können Sie andere Code-Generatoren oder Tools oder Frameworks aussehen wollen in denen mehr Ihre Anforderungen genau entsprechen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top