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).