2009-09-03 8 views
6

Sto implementando raccolte .NET generiche e persistenti basate sul motore di database ESENT (utilizzando il livello di interoperabilità ManagedEsent). Finora mi sono concentrato su classi che imitano esattamente le loro controparti System.Collections.Generic, tranne che prendono un percorso nel costruttore che indica dove dovrebbe andare il database. Codice come questo sta lavorando:Cosa vogliono le persone in un persistente dizionario .NET?

using Microsoft.Isam.Esent.Collections.Generic; 

static void Main(string[] args) 
{ 
    var dictionary = new PersistentDictionary<string, string>("Names"); 
    Console.WriteLine("What is your first name?"); 
    string firstName = Console.ReadLine(); 
    if (dictionary.ContainsKey(firstName)) 
    { 
     Console.WriteLine("Welcome back {0} {1}", firstName, dictionary[firstName]); 
    } 
    else 
    { 
     Console.WriteLine("I don't know you, {0}. What is your last name?", firstName); 
     dictionary[firstName] = Console.ReadLine(); 
    } 
} 

Le mie domande sono:

  • Altro che la compatibilità con la pila, coda e Dizionario quali caratteristiche la gente vuole/bisogno in collezioni persistenti?
  • Devo richiedere la versione 2.0 o la versione 3.5 del framework .NET?
  • I tipi di chiave e valore sono entrambi limitati ai tipi .NET di base (bool, byte, [tutti gli interi], float, double, Guid, DateTime e string). Potrei aggiungere il supporto per i valori che sono strutture serializzabili. Questo tipo di restrizione è troppo doloroso?
  • Che tipo di benchmark delle prestazioni vogliono vedere le persone?
  • Per che tipo di applicazioni si desidera utilizzare PersistedDictionary?

Avrò la prima versione pronta la prossima settimana, ma voglio assicurarmi di costruire la cosa giusta.

+0

A proposito, 'System.Decimal' è anche un tipo di base in un certo senso (non per quanto riguarda CLR è interessato, ma sicuramente per quanto riguarda qualsiasi C# o VB sviluppatore è interessato). –

+0

Non dovrebbe essere questo wiki della comunità? –

+1

['PersistentDictionary '] (http://izlooite.blogspot.com/2011/04/persistent-dictionary.html) –

risposta

4

Ho pubblicato PersistentDictionary su Codeplex. Questo supporta solo la serializzazione delle strutture, ma lavorerò su una struttura dati diversa che supporta la memorizzazione e il recupero di oggetti arbitrari.

http://managedesent.codeplex.com/

3

La restrizione del tipo può essere accettabile per le chiavi, ma per i valori, mi aspetto che tutto funzioni [Serializable]. Altrimenti, qual è il punto? Casi semplici come Dictionary<int, string> sono visti nei libri di testo molto più spesso che nel mondo reale.

+2

Il problema è che non riesco a trovare la semantica del dizionario di sistema. Se si aggiunge un oggetto serializzabile a un dizionario, questo viene aggiunto per riferimento, pertanto la modifica dell'oggetto modifica l'oggetto nel dizionario (si tratta dello stesso oggetto). Qualsiasi oggetto aggiunto a PersistentDictionary verrà aggiunto per valore, creando un clone. Sono preoccupato per le stranezze API che questo genererebbe. –

+2

Per i tipi "base", la semantica continuerà a corrispondere. Per i tipi definiti dall'utente, continuerà a corrispondere per i tipi di valore e i tipi di riferimento pseudo-valore (ad esempio, classi immutabili come 'Uri'). Anche dove non combacerà, direi che un simile comportamento è ancora molto più utile che vietarlo a titolo definitivo. Ovviamente c'è un certo potenziale di confusione, quindi dovrai avvertirlo chiaramente. Ma penso che l'utilità trionfi semplicità qui. –

Problemi correlati