2011-12-20 3 views
0

Je suis actuellement en train de refactoriser un système.Conception basée sur le domaine - Problème de conception racine agrégée

J'ai la situation suivante:

Le système est de fournir des informations sur les entreprises dans plusieurs secteurs d'activité. Chaque entreprise peut être active dans un ou plusieurs secteurs. Les entreprises peuvent participer à certains programmes partenaires. Une entreprise peut avoir un ou plusieurs fabricants partenaires (par exemple un garage peut avoir un partenariat avec BMW/Mercedes) etc. Toutes ces participations existent pour une période donnée (période de validité). De plus, un constructeur comme BMW est lié à un secteur d'activité. Ainsi, une entreprise ne peut être partenaire de BMW, si BMW est valable pour le secteur des entreprises. C'est parce que le système ne maintient pas seulement les entreprises d'un secteur d'activité comme les garages, mais aussi les services de remorquage, etc.

Donc maintenant, mon design peut causer des invariants.

Société -> Cession (non variation lente) -> Secteur d'activité

Société -> Partenariat (date de - à) -> Organisation < - Secteur d'activité

Où et organisation de sociétés doivent partager le même Affectation du secteur des entreprises.

Donc, en ce moment, on pourrait changer l'assigment du secteur d'activité d'une organisation. Alors ce serait la règle d'avoir le même secteur d'activité pour être invalide.

Comment pourriez-vous modéliser quelque chose comme ça?

+0

Je doute ce sont vrais invariants. –

Répondre

0

Quelque chose ne va pas dans votre explication. Il n'y a pas de racines agrégées dans cette conception.

Mais logiquement sans doute les déclarations suivantes conflit

constructeur comme BMW est lié à un secteur d'activité (1)

et

on pourrait modifier l'affectation du secteur des entreprises de une organisation (2)

S'ils le font, vous devez éviter l'un d'entre eux.

Si (2) est faux, alors tout va bien, non? Vous ne permettez tout simplement pas un tel changement.

Si (1) est faux (ou plutôt pas si restrictif), les limites d'organisation avec le secteur d'activité doivent également être limitées à une certaine période de temps. Dans ce cas, vous le faites de la même manière que la limitation de période de partenariat. Par exemple, vous pouvez définir Partnership.EndDate sur la date de modification du lien Organisation-> Secteur.

En outre, vous pouvez conserver une liste historique de l'organisation des secteurs à laquelle vous avez participé. Les règles métier imposent des périodes de correspondance pour l'attribution de partenariat et de secteur.

Espérons que ça aide. (Et en fait les questions de conception générique devraient aller au site programmers.)

2

Je vois 2 façons DDD conformes de l'application de cette règle d'entreprise:

  • DDD specifies que dans un agrégat invariants doivent être appliquées par la racine globale. Si la Société est la racine de votre ensemble, lorsque vous ajoutez un nouveau partenariat à lui, il pourrait vérifier si le partenariat est conforme à la règle du secteur des entreprises (éventuellement en utilisant un modèle Specification: EligibleForPartnershipSpecification par exemple)

  • Lors d'un changement de secteur d'activité d'une organisation , c'est une bonne idée de penser en termes de "can the operation be performed ?" rather than "is this entity valid ?". Cela peut signifier de vérifier si une société dans le référentiel de l'entreprise a un partenariat qui deviendrait incohérent après la modification et déciderait de ce qu'il convient de faire (éventuellement sur la base d'un modèle de politique/stratégie) en conséquence.

Les contrats sont une autre façon intelligente de faire respecter invariants: voir http://msdn.microsoft.com/en-us/magazine/hh205755.aspx (.NET)

Questions connexes