2

Je développe une logiciel où j'ai quelques entités telles que:architecture en couches Question

public class Workspace 
    { 
     public int ID { get; set; } 
     public string Name { get; set; } 
     public string Description { get; set; } 

     public virtual List<Playground> Playground { get; set; } 
     public virtual List<Workspace> Children { get; set; } 
     public virtual List<Member> Members { get; set; } 

     public virtual Workspace Parent { get; set; } 
    } 

public class Playground 
    { 
     public int ID { get; set; } 
     public string Name { get; set; } 
     public string Description { get; set; } 

     public virtual List<Service> Services { get; set; } 

     public virtual Workspace Workspace { get; set; } 
    } 

public class Service 
    { 
     public int ID { get; set; } 
     public string Name { get; set; } 
     public string Description { get; set; } 

     public virtual Playground Playground { get; set; } 
    } 

Ce sont mes objets EF4 POCO. J'utilise le modèle de référentiel et l'interface suivante:

public interface IRepository<T> 
{ 
    void Add(T entity); 
    void Delete(T entity); 
    IEnumerable<T> Get(Expression<Func<T, bool>> expression); 
    IEnumerable<T> Get(); 
    void Attach(T entity); 

    int Save(); 
} 

Les référentiels ont un ObjectContext interne. J'ai un UnitOfWork qui contient des instances de mes dépôts et est responsable d'enregistrer les modifications qui leur sont apportées.

Est-ce que je le fais bien jusqu'à maintenant?

Je suis une couche en œuvre logique métier comme ceci:

public class DomainWorkspaceService : DomainServiceBase 
    { 

     public DomainWorkspaceService(Workspace workspace) 
      : base(UnitOfWorkFactory.GetInstance()) 
     { 
     } 

     public void Create(Workspace workspace) 
     { 
      UoW.GetRepository<Workspace>().Add(workspace); 
     } 

     public void Delete(Workspace workspace) 
     { 
      var pservice = new DomainPlaygroundService(); 
      foreach (var playground in workspace.Playground) 
       pservice.Delete(playground); 

      foreach (var child in workspace.Children) 
       Delete(child); 
     } 

    } 

Maintenant, je ne suis pas sûr que je vais dans la bonne direction. Mes Poços sont (seront) responsable de la validation et de me permettre de faire quelque chose comme

SomeWorkspace.Children.Add(new Workspace {...}); 

Étant donné que ces objets sont associés à un contexte, quand je les sauvegarde seront les modifications apportées aux collections sont enregistrées aussi dans la base de données ?

En outre, je veux que mes terrains de jeu ne peuvent pas être créés sans un espace de travail et des services sans terrain de jeu. Où dois-je créer et supprimer les?

Merci.

+1

Si vous ne voulez pas forcer le terrain de jeu à être construit avec un espace de travail - ajoutez des constructeurs qui les exigent. La même chose pour les services. –

+0

Oui. Je vous remercie. – codegarten

Répondre

1

Jusqu'ici, tout va bien.

Vous souhaitez probablement déplacer votre méthode Save du Référentiel vers l'unité de travail. Dans Entity Framework, vous devez enregistrer tous les changements dans le contexte à la fois; vous ne pouvez pas le faire par type. Le mettre sur le Repository implique que seules les modifications du référentiel seront enregistrées, ce qui n'est probablement pas correct. Vous pouvez implémenter la cascade de l'espace de travail vers le terrain de jeu en tant que cascades de base de données (que Entity Framework reconnaîtra et supportera) au lieu de les coder manuellement. Oui, enregistrer les modifications apportées au contexte sauvegardera toutes les modifications suivies, y compris les objets associés. En ce qui concerne l'ajout, si vous n'exposez pas le ObjectContext, la seule façon pour quiconque d'ajouter un Playground est d'établir des relations avec les objets que vous exposez.

+0

Oui, l'enregistrement n'est pas supposé être sur le référentiel et je vais changer la suppression en cascade. Maintenant, j'ai du mal à placer les méthodes de création (j'ai besoin d'un traitement supplémentaire lors de la création d'un service (c'est-à-dire). Devraient-ils être des endroits dans un objet spécifique, comme le DomainWorkspaceService j'ai ajouté ci-dessus? Merci – codegarten

+0

Ma règle générale est que le référentiel est strictement pour encapsuler la persistance. Si c'est une logique métier, ça va dans le service. Si c'est lié à la persistance (par exemple, génération d'ID ou quelque chose comme ça), il va dans le référentiel. Le référentiel devrait être assez simple. –