Question

J'ai traversais les tutoriels (en particulier ceux qui utilisent LINQ-to-entités) et je comprends les concepts de base, mais certaines choses me donnent des problèmes.

Les travaux pratiques comportent généralement que des modèles simples et des formes qui n'utilisent de base créent, mettre à jour et de supprimer des instructions. Les miens sont un peu plus compliqué, et je ne suis pas sûr que je vais sur ce la bonne façon parce que quand vient le temps de gérer les relations d'une demi-douzaine d'objets de base de données, les tutoriels cesser d'aider.

Pour la méthode post, la manière habituelle d'effectuer des opérations CRUD

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

Ne faire ce que je veux, parce qu'une classe entièrement mis en œuvre ne reçoit pas affiché à la méthode du contrôleur. Je peux poster des champs individuels, des collections de forme, ou plusieurs objets DTO puis appeler une méthode sur un service ou un dépôt de prendre les informations que je reçois d'un poste de forme, ainsi que des informations dont il a besoin pour interroger ou de créer lui-même, puis de toutes ces choses, créer mon objet de base de données que je peux sauver.

[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();
}

Suis-je la manipulation de ce bien ou que je bâtarde le cadre? Je ne l'utilise en fait un objet d'entité directement, chaque fois que je fais une recherche que je mets l'information nécessaire dans un DTO et la base de mes vues hors de cela. Même chose avec la création. Est-ce permis, ou est mon éviter d'utiliser des entités allant directement contre le but d'utiliser le cadre?

Edit: Je suis aussi inquiet au sujet de cette approche, car elle exige des constructeurs vides pour faire correctement les requêtes LINQ à cause de ce message d'erreur:

  

Seuls les constructeurs et sans paramètre   initializers sont pris en charge dans LINQ to   Les entités.

Ce n'est pas un gros problème car j'ai rarement besoin logique int les constructeurs, mais est-ce un problème de ne pas avoir constructeurs et seules les propriétés publiques?

Était-ce utile?

La solution

_someRepositoryOrService.Add (id, Classa, ClassB);

Je dirais que vous couplez vos dépôts avec la couche de présentation. Cela ne devrait pas être. Vos dépôts ne doivent travailler avec des entités. Ensuite, remarquez comment votre méthode Add

public void Ajouter (id int, ClassA CLASSA, ClassB ClassB)

rompt Séparation des préoccupations (SoC). Il effectue deux tâches:

  1. données de la carte dans des entités
  2. Enregistrer dans le référentiel

Il est évident que devrait être fait la première étape dans la couche de présentation. Pensez à utiliser les liants modèles pour cela. Il peut également vous aider à résoudre le problème des constructeurs, puisque vos classeurs modèles peuvent être mis au courant des exigences de construction.

Vérifiez aussi cet excellent après par Jimmy Bogard (co-auteur de ASP.NET MVC en action) au sujet ViewModels. Cela pourrait vous aider à automatiser la cartographie. Il suggère également une technique inversée - faire vos contrôleurs fonctionnent avec des entités, non ViewModels! les filtres d'action personnalisés et classeurs modèles sont vraiment la clé pour éliminer routine qui n'appartiennent pas vraiment aux contrôleurs, mais plutôt un détail d'infrastructure entre la vue et le contrôleur. Par exemple, 's comment j'automatiser les entités retrival. Voici l ' comment je vois ce que les contrôleurs devraient faire .

Le but ici est de faire des contrôleurs contentrate sur la gestion de la logique métier, en mettant de côté tous les détails techniques qui ne font pas partie de votre entreprise. Il est des contraintes techical que vous parlez dans cette question, et laissez-vous les fuites dans votre code. Mais vous pouvez utiliser des outils MVC pour déplacer le leur niveau les infrastructures.

MISE À JOUR: Non, les dépôts ne doivent pas manipuler les données de formulaire, c'est ce que je veux dire par « couplage avec la présentation ». Oui, les dépôts sont dans le contrôleur, mais ils ne fonctionnent pas avec les données de formulaire. Vous pouvez (pas que vous) faire sous forme de travail avec « référentiels de données » - à savoir des entités - et c'est ce que la plupart des exemples font, par exemple NerdDinner - mais pas l'inverse. Ceci est dû à la règle générale - les couches supérieures peuvent être couplées avec celles du bas (présentation couplée avec les dépôts et les entités), mais jamais faible niveau devraient être couplés à ceux plus élevés (entités dépendent des référentiels, des référentiels dépendent du modèle de formulaire, etc. ).

La première étape doit être fait dans le dépôt, qui est juste - sauf que le mappage de ClassX à EntityX n'appartient pas à cette étape. Il est problème de cartographie - une infrastructure. Voir, par exemple cette question sur la cartographie, mais généralement si vous ont deux couches (UI et dépôts), ils doivent se soucient pas de la cartographie - un service de mappeur / aide devrait. À côté du blog de Jimmy, vous pouvez également lire ASP.NET MVC en action ou simplement regarder à leur CodeCampServer pour la façon dont ils font la cartographie des interfaces IEntityMapper transmises aux constructeurs de contrôleur (notez que ceci est plus manuel et approche moins que le travail AutoMapper Jimmy Bogard).

Une autre chose. Lisez à propos de Domaine Driven Design chercher des articles, apprendre d'eux, mais vous ne devez pas suivre tout. Ce sont des lignes directrices et non des solutions strictes. Voyez si votre projet peut gérer cela, voir si vous pouvez gérer cela, et ainsi de suite. Essayez d'appliquer ces techniques car ils sont généralement les moyens excellents et approuvés de faire le développement, mais ne les prennent pas aveuglément -. Il vaut mieux apprendre le long du chemin que d'appliquer quelque chose que vous ne comprenez pas

Autres conseils

Je dirais en utilisant DTO et enveloppant le Entity Framework avec vos propres méthodes d'accès aux données et la couche d'affaires est un excellent moyen d'aller. Vous pouvez finir par écrire beaucoup de code, mais il est une meilleure architecture que de prétendre le code généré Entity Framework est votre couche d'affaires.

Ces problèmes ne sont pas liés vraiment nécessairement à ASP.NET MVC de quelque façon. ASP.NET MVC donne essentiellement aucune indication sur la façon de faire votre modèle / accès aux données et la plupart des échantillons et des tutoriels pour ASP.NET MVC ne sont pas dignes de production mises en œuvre de modèle, mais vraiment juste des échantillons minimum.

Il semble que vous êtes sur la bonne voie, continuez.

En fin de compte, vous utilisez Entity Framework principalement comme un générateur de code qui ne génère pas code très utile et donc vous pouvez regarder dans d'autres générateurs de code ou des outils ou des cadres qui plus étroitement correspondant à vos besoins.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top