Sto costruendo un'applicazione responsabile della lettura dei dati dai file e della loro visualizzazione nei grafici. L'intera applicazione è responsabile della manipolazione dei dati da file, il che significa che devo utilizzare diverse parti dello stesso oggetto in quasi tutte le parti del mio progetto. I grafici hanno bisogno di dati reali, l'elenco dei file aperti ha bisogno di nomi e stati di dati, ecc. Inoltre, la mia applicazione utilizza MEF
, quindi altri possono aggiungere nuove funzionalità e modificare i moduli correnti.
Il mio problema più grande è come separare i dati, in modo che ogni livello della mia applicazione abbia accesso solo a parte dei dati necessari per il loro funzionamento. Quello che intendo per dati è:
- Nome del file
- Id guida
-
List<IColumn>
dati obyte[]
dati - Altre variabili future
Ho deciso di utilizzare tutta la mia applicazione IDocument
. Questa è la mia rappresentazione personalizzata di un file che può essere letto e visualizzato nel grafico. Ogni IDocument
deve avere un Id
e Name
perché ogni file del computer ha un nome. Questo ha tutte le informazioni necessarie per un semplice elenco di file che sono stati importati nell'applicazione. Ma non ha i dati effettivi che voglio visualizzare, quindi uso il database NoSQL per archiviare IDocumentData
che ha List<IColumn> Columns
che posso inserire in un grafico. IColumn
ha solo List<object> Rows
che sostanzialmente riproduce una tabella.
Quindi ho separato il mio file in IDocument
e IDocumentData
, ora come faccio a tenere traccia di quali dati appartengono a quale documento? Ottengo IDocumentData
dal modulo IReader
e ottengo IWizardData
dal modulo IFileImporterWizard
.
Stavo pensando di creare un qualche tipo di builder che assegnerebbe lo stesso Id a IDocument
e IWizardData
(contiene% importato% co_de e Name
) e quando vorrei accedere ai dati vorrei passare Id
da% codice%. È un buon approccio?
Quindi ad esempio:
public class DocumentBuilder {
private IDocumentFactory _documentFactory;
private IDocumentDataRepository _documentDataRepository;
public DocumentBuilder(IDocumentFactory documentFactory, IDocumentDataRepository documentDataRepository)
{
_documentFactory = documentFactory;
_documentDataRepository = documentDataRepository;
}
public IDocument Build(IWizardData wizardData, IDocumentData documentData)
{
var document = _documentFactory.Create();
document.Id = wizardData.Id;
documentData.Id = wizardData.Id;
_documentDataRepository.Add(documentData);
return document;
}
}
Quindi il mio modo di pensare è il seguente: Apri procedura guidata file restituisce Id
(nome, filePath) - > IDocument
restituisce IWizardData
( IReader
colonne) - > IDocumentData
build List<IColumn>
e salva i dati
Modifica
Quindi ho capito come separare i livelli aziendali e di dati creando
interface IDocument : IDocumentData, IDocumentInformation
DocumentBuilder
ha un nome e altre informazioni. IDocument
ha IDocumentInformation
e IDocumentData
. Posso salvare Id
e DataTable Data { get; set; }
separatamente e avere ancora IDocumentData
uguale per entrambi.
Ho deciso di cambiare IDocumentInformation
e Id
, perché spero che IColumn
causerà meno problemi. Anche se mi chiedo ancora se List<object> Rows
sia una buona scelta, perché probabilmente ridurrà le prestazioni durante il caricamento dei dati. Ho pensato che sarebbe una buona idea caricare da DataTable
solo un paio di record e poi aggiungerli al grafico e farlo scorrere fino alla fine.
Quindi ora DataTable
restituisce NoSQL
, IFileWizard
prende IDocumentInformation
e restituisce IReader
e quindi vengono combinati.
Il nome di queste cose richiede un po 'di tempo, perché tutte usano parti dello stesso oggetto, ma vedere IDocumentInformation
che restituisce IDocumentData
è un po' strano. D'altra parte per renderli facilmente intercambiabili dovrei dichiarare interfacce ancora più comuni e creare IFileWizard
e avere IDocumentInformation
e quindi restituire interface IFileWizardResult:IInfo
e lanciarlo a interface IDocumentInformation:IInfo
, ecc. Io non sapere se questo è troppo disaccoppiato o meno. Voglio che questa applicazione sia facilmente scalabile, ma creare molte interfacce non significa sempre un migliore disaccoppiamento.