2008-10-16 15 views
19

Jusqu'à présent, j'utilisais des enregistrements actifs dans toutes mes applications pilotées par base de données C#. Mais maintenant, mon application nécessite que mon code de persistance soit séparé de mes objets métier. J'ai lu beaucoup de messages concernant le modèle de cartographie des données de Martin Fowler, mais ma connaissance de ce modèle est encore très limitée.Modèle de mappeur de données

Prenons l'exemple suivant:

Si j'ai 2 tables - Client et CustomerParameters. La table CustomerParameters contient les valeurs client par défaut pour la création d'un nouveau client.

Je devrai alors créer une classe CustomersMapper pour gérer toute la persistance du client. La classe Mes clients et CustomersList collabore ensuite avec cette classe de mappeur afin de conserver les données client.

je les questions suivantes:

  1. Comment puis-je transférer les données brutes À & de ma classe client au mappeur sans enfreindre certaines règles d'affaires? DTO?

  2. Est-il acceptable d'avoir une méthode SaveAll et LoadAll dans ma classe Mapper pour mettre à jour et charger les données de plusieurs clients? Si oui, dans le cas de SaveAll, comment le mappeur sait-il quand mettre à jour ou insérer des données?

  3. La classe de mappage client sera-t-elle responsable de la récupération des valeurs par défaut de la table CustomerParameters ou sera-t-il préférable de créer un mappeur CustomerParameters?

Un outil de mappage O/R n'est pas vraiment disponible. La base de données que j'utilise est Transactional et nécessite que j'écrive mon propre Pattern Mapper.

Toutes les idées et commentaires seront grandement appréciés.

+2

Pourriez-vous sur votre sens de « transactionnelles », en particulier l'opposant à SGBDR traditionnellement transactionnels comme MS-SQL ou MySQL? Sinon, j'appuierais la réponse de Petter sans équivoque. –

+1

Im utilisant Btrieve (basé sur la méthode d'accès séquentiel indexé (ISAM)) qui n'est pas basé sur SQL. Tous les outils de mappage O/R que je connais ne prennent pas en charge Btrieve. – MegaByte

Répondre

0

Je vous suggère de jeter un coup d'œil à un outil de mappage O/R avant d'essayer d'implémenter vous-même le modèle Data Mapper. Cela vous fera gagner beaucoup de temps. Un choix populaire de O/R-mapper est NHibernate.

+0

Un outil de mappage O/R n'est pas vraiment une option pour moi. La base de données im using est transactionnelle et exige que j'écrive mon propre modèle de mappeur. – MegaByte

11

Shaun je répondre à vos questions ainsi:

ad 1) Mapper est responsable de la création de l'objet client. Votre objet Mapper aura quelque chose comme la méthode RetrieveById (par exemple). Il acceptera un identifiant et en quelque sorte (ce qui n'est pas la responsabilité de l'objet Mapper) construit l'objet Client valide. La même chose est vraie dans l'autre sens. Lorsque vous appelez la méthode Mapper.Update avec un objet Customer valide, l'objet Mapper est chargé de s'assurer que toutes les données pertinentes sont conservées (le cas échéant - db, mémoire, fichier, etc.)

ad 2) Comme noté ci-dessus retrieve/persistent sont des méthodes sur l'objet Mapper. Il est de sa responsabilité de fournir une telle fonctionnalité. Par conséquent, LoadAll, SaveAll (transmettant probablement un tableau d'objets de valeur) sont des méthodes Mapper valides.

ad 3) Je dirais oui. Mais vous pouvez séparer différents aspects des objets Mapper dans des classes séparées (si vous le souhaitez/devez): valeurs par défaut, validation de la règle, etc.

J'espère que ça aide. Je vous suggère/je vous recommande de lire le livre de Martin Fowler Patterns of Enterprise Application Architecture.

0

Vous pouvez consulter iBATIS.NET comme une alternative à NHibernate. C'est aussi un outil O/R, mais je l'ai trouvé un peu plus facile à utiliser que NHibernate.

http://ibatis.apache.org/