2017-10-09 8 views
0

Je construis un système dans lequel Meeting peut avoir zéro ou plus Attachment s. Pour éviter de charger le fichier binaire de pièce jointe chaque fois que je charge un Meeting, j'ai un AttachmentRef(size, mimetype, reference, name, hash).Gestion des pièces jointes

Cette référence est créée par une usine deviner le mimetype, calculer la hash et size et que tout est d'origine assurent sauvé côté du contenu binaire: AttachmentsFactory.create(name, byte[]):AttachmentRef. Puis, lorsque l'utilisateur veut récupérer une pièce jointe, il doit déréférencer la référence. Le Attachment est plus ou moins identique à une référence sauf qu'il a le contenu binaire Attachment(size, mimetype, name, content) (Itw peut être implémenté avec une composition de référence et un octet []).

Ma question concerne la récupération de cette pièce jointe, j'ai deux possibilités principales et je voudrais savoir laquelle est la meilleure dans un design "DDD"?

1 - référence Dumb, le service intelligent

AttachementService { 
    dereference(ref):Attachment { 
    // Get the binary, recompute and verify the hash and return an Attachment 
    } 
} 

attachmentService.dereference(ref) 

2 - référence intelligente, service muet

AttachmentService { 
    read(ref):byte[] { 
     // Just return the content for the ref 
    } 
} 

AttachmentReference { 
    dereference(attachmentService) { 
     content = attachmentService.read(this) 
     // recompute and verify the hash 
     return new Attachment(this, content) 
    } 
} 

ref.dereference(attachmentService) 

Répondre

1

Ceci est en fait un très bon exemple des interactions entre Contextes bornés .

Si votre Meeting est dans une Colombie-Britannique et votre contenu est dans le Content BC alors vous pourriez très bien avoir le contenu physiquement attaché (byte[]) représenté comme valeur objet dans votre Meeting comme vous l'avez fait avec votre référence.

Le contenu ci-joint peut être représenté comme ContentItem ou quelque chose comme dans votre Content BC et que ce serait un agrégat racine.

La récupération du contenu réel se produirait typiquement sur la couche d'intégration/application. Pas besoin d'avoir cela dans le Meeting BC car il ne ferait pas beaucoup, je suppose.

+0

Ok merci; C'est plus ou moins ce que j'avais en tête. Mais pour retourner le contenu d'une pièce jointe, je dois vérifier que son hash est inchangé. Est-ce la responsabilité de 'AttachmentRef' ou de la couche application? En fait, c'est le 'AttachmentFactory' qui calcule le hash et construit le' AttachmentRef' mais idéalement l'algorithme doit être le même (code) alors où dois-je le mettre? –

+1

Je place ce traitement dans la couche application/intégration. Lorsque vous stockez initialement la pièce jointe, vous devez calculer le hachage et il est associé à la pièce jointe. Vous pouvez même ajouter un nom d'algorithme à la pièce jointe (ou le faire plus tard si vous souhaitez changer d'algorithme). Ensuite, lorsque vous récupérez le contenu, disons, 'ContentService' aurait l'algorithme de hachage injecté (ou le conteneur de l'algorithme). Il pourrait alors retourner le résultat d'un fetch et le résultat peut indiquer si le hachage était une correspondance; Sinon, lancez une exception si elle ne correspond pas et devient un problème d'opération. –

+0

Merci beaucoup Eben –