0

Je pense avoir des erreurs de conception dans mon projet Web en cours (j'utilise Linq2SQL pour implémenter le modèle de référentiel) 1) Chaque référentiel crée son propre DataContext (est-ce correct?) Pour exemple:Problèmes de conception de référentiel

public class SQLPersonRepository : IPersonRepository 
{ 
    DataContext dc; 

    public SQLPersonRepository(string connectionString) 
    { 

     dc = new DataContext(connectionString, Mapping.GetMapping()); 

     personTable = (dc).GetTable<Person>(); 
     personRoleTable = (dc).GetTable<PersonRole>(); 
     roleTable = (dc).GetTable<Role>(); 

    } 
    Get Method 
    Add Methods for the different Tables 
    Save Method 
} 

et un autre exemple:

class SQLTrainingCenterRepository:ITrainingCenterRepository 
    { 
     DataContext dc; 
     private Table<Trainingcenter> trainingCenterTable; 

    public SQLTrainingCenterRepository(string connectionString) 
     {    
      dc = new DataContext(connectionString, Mapping.GetMapping()); 

      trainingCenterTable = (dc).GetTable<Trainingcenter>();    
     } 

     Get Methods 
     Add Method 
     Save Method   
} 

Comme vous pouvez le comprendre j'utilise IoC (Windsor, en utilisant le mode de vie = "PerWebRequest").

2) Utiliser une couche de services pour chaque référentiel. Par exemple. pour les personnes

public class PersonBusinessLayer 
{ 
    IPersonRepository personRepository; 

    public PersonBusinessLayer(IPersonRepository personRepository) 
    { 
     this.personRepository = personRepository; 

    } 
    ... diverse Get Methods 
    Add Method (wrapper around repository.Add) 
    Save Method (wrapper around repository.Save) 
} 

Est-ce la bonne façon de définir une couche de services? Ou devrais-je utiliser une classe de service qui fait référence à tous les dépôts?

3) Il existe une relation entre personTable et trainingCenterTable. Chaque fois que j'insère quelque chose dans le TrainingCenter-Service, je dois également insérer un enregistrement dans le Person-Service. Donc, la solution est de dire:

TrainingCenterBusinessLayer.Insert(trainingCenter); 
PersonBusinessLayer.Insert(person); 

Bien sûr, je veux ces deux insertions qui se passent de manière transactionnelles, donc je décide de conclure ces déclarations

using (TransactionScope scope = new TransactionScope()) 
{ 
... 
} 

Donc, il se pose un nouveau problème: MSDTC sur le serveur '. \ SQLEXPRESS' n'est pas disponible (car il existe différents DataContexts, non?). Comment surmonter cela?!?

Une solution serait de créer le DataContext en externe et de le passer en paramètre dans le dépôt! Corriger la pensée? Mais comment mettre en œuvre?

4) Avec la conception existante, je dois appeler: TrainingCenterBusinessLayer.Save(); PersonBusinessLayer.Save(); Je pense que c'est faux! L'opération save() doit être appelée une seule fois dans le DataContext. Mais comment? (apparemment cela peut être résolu si le point ci-dessus est résolu).

Répondre

0

Si vous faites plein sur DI, vous devriez essayer de passer autour d'une abstraction (interface) en tant que dépendance. De cette façon, si vous voulez vous moquer, vous pouvez facilement changer sa mise en œuvre.

DataContext est OK pour passer autour, mais peut-être un peu lourd. Un meilleur choix IMO serait IDbConnection.Une connexion chaîne n'est pas vraiment une dépendance, c'est un paramètre utilisé pour initialiser une implémentation spécifique d'une dépendance.

Il y a aussi l'approche MvcFakes avec IDataContext et l'encapsulation de contexte, mais je trouve que ça fait mal. Tant que vos instances DataContext partagent la même instance de connexion , vous n'avez pas besoin d'une transaction distribuée.

Questions connexes