2009-06-26 6 views
1

J'essaie de mettre en œuvre un système web hautement réutilisable où la source de données pour le modèle peut être modifiée à volonté. Ce dont j'ai besoin, c'est d'un type générique au lieu de me fier au type généré par LINQ ou les entités.Représentations de modèles génériques dans ASP.NET MVC

This tutorial va sur la séparation pour une haute réutilisabilité, mais que se passe-t-il si la représentation des données entre les entités et LINQ change si légèrement? Ensuite, vous devez changer la vue. Les classes générées par LINQ et les entités sont-elles garanties pour être transmises à la vue? Est-il possible de créer une classe/interface qui représente génériquement les données?

EXEMPLE

namespace Intranet.Areas.Accounts.ViewModels 
{ 
    using Intranet.Areas.Accounts; 
    using System.Collections.Generic; 
    using Intranet.Areas.Accounts.Models; 

    public class ContractsControlViewData 
    { 
    public IEnumerable<Contract> Contracts { get; set; } 
    public IEnumerable<tblCC_Contract_CC> tblCC_Contract_CCs { get; set; } 
    public IEnumerable<tblCC_Contract_Data_Terminal> tblCC_Contract_Data_Terminals { get; set; } 
    public IEnumerable<tblCC_CDT_Data_Service> tblCC_CDT_Data_Services { get; set; } 
    public IEnumerable<tblCC_Data_Service> tblCC_Data_Services { get; set; } 
    } 
} 

Le code ci-dessus est tirée d'un petit projet que je teste. Notez que j'ai des types qui commencent par "tbl". Je viens de les faire glisser d'une base de données sur le concepteur LINQ et je les utilise dans ce conteneur qui est passé à la vue pour rendre plus tard plusieurs ensembles de résultats à l'écran.

Le problème est que si je fossé entités LINQ et utiliser à la place, les données seront reflétées toujours de la même manière que les types représentés ici? Est-ce que Contract sera toujours valide? Gardez à l'esprit que ces types dans l'exemple de code précédent sont générés par LINQ. Dans quelle mesure sont-ils cohérents si vous utilisez une technologie d'accès aux données différente?

C'est pourquoi je me demande si nous devrions, pour la séparation des préoccupations, et pour la cohérence des données à la place créer nos propres classes pour représenter les données de manière cohérente.

Mon cerveau fait mal, quelqu'un me sauve de moi-même.

Répondre

1

La classe que vous créez ne serait-elle pas très proche d'un DataTable, DataRow ou même d'une NameValueCollection? Votre objet devrait inclure son schéma en tant que partie de lui-même et la vue devrait itérer sur la collection (s).

+0

J'utilise IMultipleResult à partir de fonctions définies dans mon fichier dbml pour renvoyer plusieurs ensembles de résultats qui ont des représentations de classe en tant que conteneur pour quand ils sont passés à la vue.Le conteneur repose sur les types générés par LINQ, ce qui signifie qu'il ne doit y avoir aucune différence entre les classes générées automatiquement pour la sortie des requêtes. Si vous regardez les classes générées par LINQ, leur 'schéma' est juste des représentations d'objets des types de données (c'est-à-dire, string, int etc.) donc je ne l'ai pas vu comme initialement difficile. – Kezzer

1

C'est pourquoi je me demande si nous devrions, pour la séparation des préoccupations, et pour la cohérence des données créer plutôt nos propres classes pour représenter les données de manière cohérente.

Oui 100%

Je n'ai aucune expérience avec LINQ to SQL et entités moi-même. J'ai utilisé d'autres ORM et la première chose que j'ai toujours vérifiée était si je pouvais toujours utiliser mes propres classes POCO dans toutes les couches.

À mon bureau, certains collègues ont construit une application assez volumineuse en utilisant linq to sql. J'ai eu du mal à croire que cela était possible, à cause de la façon dont les changements à la base de données se répercuteraient dans toutes les couches.

Ils ont même un drôle de problème depuis SP1 en allemand: toutes les classes de collection ont un indicateur allemand pour la pluralité. C'est plutôt cool si vous avez des développeurs dans plusieurs pays. Mieux vaut ne pas laisser les développeurs en Chine régénérer votre dbml.

Il s'est avéré que mes collègues ont fait exactement ce que vous décrivez: ils avaient leurs propres classes de modèle (Poco) qu'ils mappaient aux classes linq générées dans la couche DB.

Questions connexes