2012-05-27 5 views
3

J'ai un objet: BibliothèqueModèle de domaine avec modèle de référentiel

Une bibliothèque peut contenir plusieurs livres, CD et documents. Chaque classe a la propriété Id, Name et Price à l'exception de la classe Library qui a la propriété Address.

Je souhaite créer un modèle de référentiel pour extraire les données stockées dans les couches ci-dessus. À l'heure actuelle, les données sont stockées dans des fichiers XML.

<library> 
<books></books> 
<cds></cds> 
<papers></papers 
</library> 

Plus tard, nous envisageons de le stocker dans des bases de données. Nous aurons alors une table de bibliothèque, une table de livres, une table de cd et une table de papiers. L'utilisateur crée un objet de bibliothèque sur l'écran et crée ensuite des livres, des CD et des documents sur l'écran.

Il clique ensuite sur Enregistrer. À ce stade, je veux prendre l'objet de bibliothèque nouvellement créé et l'enregistrer en XML, donc je veux avoir Repository et en utilisant l'injection de dépendance, j'injecterai une implémentation du dépôt xml dans les couches ci-dessus afin que les données soient stockées correctement. Je peux sérialiser l'objet Library et obtenir xml et appeler la méthode Save simple pour enregistrer l'objet de bibliothèque.

mais imaginez que je remplace XMLRepository par DatabaseRepository.

Dans ce cas, je souhaite que le reste des couches ci-dessus reste inchangé. J'espère que LibraryRepository.Save() fera attention s'il doit aller en XML ou CSV ou DB. Je suis confus comment je vais créer un modèle de référentiel pour résoudre la méthode LibraryRepository.Save().

Tout le monde dit partout que la classe Repository devrait avoir une seule responsabilité. Il devrait seulement enregistrer un type d'objet et ne devrait pas prendre un objet, prendre ses classes liées et les enregistrer aussi. Chaque classe devrait avoir sa propre classe Repository.

De plus, chaque objet de bibliothèque possède plusieurs objets Books. Je ne veux pas utiliser une boucle for et passer par chaque livre dans la méthode LibraryRepository.Save.

Je ne sais pas comment créer mon modèle de domaine et appeler la méthode Library Save().

S'il vous plaît guider.

+0

Jetez un oeil à cet article sur la conception axée sur le domaine de MSDN http://msdn.microsoft.com/en -us/magazine/dd419654.aspx. L'article traite beaucoup de ces problèmes et contient des liens vers d'autres informations pertinentes. Vous ne devez pas créer de référentiel pour chaque objet, mais plutôt créer un référentiel pour chaque "agrégat". Le groupe d'objets qui composent une entité logique. –

+0

Je pense qu'il est préférable d'utiliser un ORM. Vous pouvez modifier le fournisseur de données sous-jacent lorsque vous le souhaitez.Par exemple, NHiberante peut stocker des données dans un fichier CSV (cochez cette question http://stackoverflow.com/questions/680994/can-nhibernate-persist-to-flat-files-instead-of-database). –

Répondre

2

Comme le référentiel est une abstraction de la persistance pour votre BL, utilisez l'interface du référentiel. Chaque implémentation de référentiel doit prendre en charge le mappage de structure d'objet vers le stockage de données ou utiliser des mappeurs spécifiques. Les classes BL/Service fonctionneraient avec le référentiel via l'interface, sans connaissance de l'implémentation interne d'un référentiel particulier.

Donc, vous auriez quelque chose comme

class LibraryService { 
    public LibraryService (ILibraryRepository repo) {} 
    public DoSomeWork(somedata) { 
     Library lib = repo.Load(somedata.libid); 
     .... 
     repo.Save(lib); 
    } 
} 

Et plusieurs implémentations

class DBLibraryRepository : ILibraryRepository { 
    public Save(Library lib) { 
     //hibernate session 
     //and you'll have mapping defined for all entities 
     //and relations between library and stuff, so books are saved automatically 
     _session.Save(lib) 
    } 
} 

class XMLLibraryRepository : ILibraryRepository { 
    public Save(Library lib) { 
     //serialized does all the work, so no additional loops here 
     var xml = Serialize(lib); 
     SaveToFile(xml); 
    } 
} 

class CSVLibraryRepository : ILibraryRepository { 
    public Save(Library lib) { 
     //for example, save library to lib.csv, books - to books.csv. 
     //add mappers to do real work, but we'd take care of separation 
     //of books and library manually. 
     // (in case of ORM - it has own mappers, 
     // for XML - serializator is mapper itself) 
     var data = LibraryCSVDataMapper.Map(lib); 
     data.Save(); 
     foreach(var book in lib.Books){ 
      data = BookCSVDataMapper.Map(book); 
      data.Save(); 
     } 
    } 
} 
Questions connexes