0

Je voudrais savoir si vous trouvez le modèle suivant significatif dans la conception pilotée par domaine.Cet exemple de service de référentiel d'entités s'intègre-t-il dans la conception guidée par domaine?

La couche de domaine est constituée d'un modèle et d'un référentiel. La couche d'application est constituée de services qui traitent les requêtes provenant de l'interface utilisateur ou de contrôleurs dans le modèle Model-View-Controller.

Détails de la structure:

 
// Assembly Model: 
public class Phrase 
{ 
    public int PhraseId { get; private set; } 
    public string PhraseText { get; private set; } 

    public Phrase(string phraseText) { this.PhraseText = phraseText; } 

    public void SetId(int phraseId) { this.PhraseId = phraseId; } 
} 

// Assembly Repository (references assembly Model): 
public interface IPhraseRepository 
{ 
    Phrase SavePhrase(Phrase phrase); 
    Phrase GetPhrase(int phraseId); 
} 

// Assembly Services (references assemblies Model and Repository): 
public class PhraseService 
{ 
    private IPhraseRepository _phraseRepository; 
    public PhraseService(IPhraseRepository phraseRepository) 
    { 
     _phraseRepository = phraseRepository; 
    } 
    public Phrase SavePhrase(string phraseText) 
    { 
     Phrase phrase = _phraseRepository.SavePhrase(new Phrase(phraseText)); 
     // doing other things like sending mail, logging, etc. 
     // ... 
     return Phrase; 
    } 
} 

En particulier, serait-il judicieux de déplacer la méthode dans la classe d'entités de phrase? Dans ce cas, comment cela serait-il appelé?

EDIT:

L'exemple ci-dessus a été modifié après la réponse de moffdub et le commentaire de Adeel Ansari. Les modifications sont en surbrillance.

Je voudrais poser une question à propos de l'ajout de IPhraseRepository.GetPhrase (phraseId) et comment vous incluez cela?

+0

À propos de la GetPhrase: Je pense que cela semble bien. Une autre option consiste à utiliser un objet de requête (http://martinfowler.com/eaaCatalog/queryObject.html) comme paramètre, si vous avez besoin de plus de critères que l'identifiant. – moffdub

+0

Un commentaire à propos de SavePhrase: Dans ce cas, lorsque vous n'obtenez pas le PhraseId jusqu'à ce que vous sauvegardez, j'ai généralement des méthodes "save" soit ne rien retourner et mettre l'ID dans la méthode, ou retourner le nouvel ID. – moffdub

Répondre

1

Le référentiel doit contenir une phrase et non une chaîne. Je ne sais pas non plus pourquoi la méthode SavePhrase renvoie une expression. J'ai tendance à faire de telles méthodes méthodes vides. De plus, méfiez-vous de faire en sorte que toutes les propriétés de votre modèle de domaine aient des getters et des setters publics. Cela peut vous conduire à un modèle de domaine anémique.

+0

Pensez que vous n'avez pas d'identifiant avant de persister dans l'entité. Vous devez avoir besoin de l'entité, dans ce cas. Pensez au type de numéro automatique dans la base de données ou à la séquence. –

+0

@moffdub et @Adeel Ansari: Merci pour vos deux réponses. J'ai appris quelque chose, je pense, et mettra à jour avec une amélioration suggérée. –

+0

Comment sérialiser avec des setters privés? Voir ma question à ce sujet ici: http://stackoverflow.com/questions/455884/conflict-between-avoiding-anemic-model-and-allowing-serialization. –

0

Juste quelques pensées:

SETID (int phraseId) ne doit pas être publique

Phrase pourrait mettre en œuvre iPhrase (ou IPhraseAggregate) qui ne l'exposerait pas SETID (..)

SavePhrase (phrase Phrase) pourrait (devrait?) renvoyer void si la référence à l'entité de phrase reste "valide" après l'enregistrement:

public void SavePhrase(string phraseText) 
{ 
    Phrase phrase = new Phrase(phraseText); // NOTE: keep a reference to phrase 
    this._phraseRepository.SavePhrase(phrase); // NOTE: returns void 

    return phrase; // NOTE: assume the repository sets the phrase.PhraseId 
} 
Questions connexes