Ho un oggetto semplice come questo
public class Book { public List Chapters { get; private set; } public TableOfContent BookTOC { get; set; } public string Identifier { get; private set; } public string Title { get; private set; } public string Publisher { get; set; } public string Rights { get; internal set; } public DateTime PublishingDate { get; internal set; } private IBookRepository _repository = null; public Book(IBookRepository bookRepository) { _repository = bookRepository; } public Book Load(string bookid) { //Load book from repository } public Chapter GetNextChapter(string chapterId) { //Load Chapter from repository } }
In questo dominio (in realtà in qualsiasi parte del mondo!), il libro ha capitoli e il libro ha ToC. Nella nostra applicazione, ci sarebbero due possibili implementazioni del repository, vale a dire che l'oggetto del libro può essere caricato da Xml o caricato dal database. Questi libri sono di dimensioni piuttosto grandi, vale a dire duecentoquattromila capitoli (Questo è tutto sui metadati del libro, il contenuto è separato ma fuori questione per ora)
Il mio problema è che quando il libro viene caricato dal database, voglio sfruttare le funzionalità del database di query e indici, ecc. Ad esempio, nel GetNextChapter, quando sto usando il repository del database, posso individuare solo il capitolo specifico e trovare dopo. Comunque nel caso di Xml, dato che non voglio attraversare xml più e più volte, mi piacerebbe tenerlo caricato in una volta inizialmente e la cache in upstream in modo da poter trovare il prossimo capitolo proprio dall'oggetto stesso. Come puoi vedere, queste due implementazioni sono diverse per natura, ma in qualsiasi momento useremo solo una di queste. Non sono in grado di trovare un'interfaccia uniforme di operazioni che entrambe queste implementazioni possano seguire. Diciamo che se decido di avere l'operazione GetNextChapter implementata in entrambi, quindi per il repository del database, ho solo bisogno dell'ID del capitolo, mentre nel repository Xml ho bisogno dell'intero oggetto libro o almeno dell'elenco dei capitoli (e anche quello non ha nulla da fare con xml in realtà perché è solo nel filtro di memoria).
Qualcuno può aiutare a decidere come uniformare questi due attraverso un'unica interfaccia con due implementazioni? O non sono destinati ad essere uniformati tramite una singola interfaccia e meritano un modo separato di implementazione?
Modifica Per chiarire ulteriormente, se aggiungo il metodo GetNextChapter nell'interfaccia, l'implementazione del database richiede solo il chapterID come parametro, mentre l'implementazione Xml richiede l'oggetto libro. Allo stesso modo il metodo LoadBook restituirà l'oggetto completo (con chatpers e toc) per XMLImplementation (in modo che non debba passare xml più volte) mentre restituirà solo oggetto parziale (senza capitoli e toc) nel caso di DatabaseImplementation (per ovvi motivi di prestazioni).
Quindi, come andranno questi due contro una singola interfaccia?