2009-09-03 9 views
6

Estoy implementando colecciones .NET genéricas y persistentes basadas en el motor de la base de datos ESENT (utilizando la capa de interoperabilidad ManagedEsent). Hasta ahora me he centrado en las clases que imitan exactamente sus contrapartidas System.Collections.Generic, excepto que toman una ruta en el constructor que indica dónde debe ir la base de datos. Código como este está funcionando:¿Qué quiere la gente en un diccionario .NET persistente?

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(); 
    } 
} 

Mis preguntas son:

  • Aparte de la compatibilidad con la pila, cola y Diccionario qué características queremos que la gente/necesidad en colecciones persistió?
  • ¿Debo solicitar la versión 2.0 o la versión 3.5 del .NET Framework?
  • Los tipos de clave y valor están restringidos a los tipos .NET básicos (bool, byte, [todos los enteros], float, double, Guid, DateTime y string). Podría agregar soporte para valores que son estructuras serializables. ¿Es este tipo de restricción demasiado dolorosa?
  • ¿Qué tipo de puntos de referencia de rendimiento desea ver la gente?
  • ¿Para qué tipo de aplicaciones la gente quiere usar un PersistedDictionary?

Voy a tener el primer lanzamiento listo la próxima semana, pero quiero asegurarme de que estoy construyendo lo correcto.

+0

Por cierto, 'System.Decimal' es también un tipo básico en algún sentido (no en lo que se refiere a CLR, pero sin duda por lo que cualquier desarrollador de C# o VB se refiere). –

+0

¿No debería ser esta la wiki de la comunidad? –

+1

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

Respuesta

4

He publicado PersistentDictionary en Codeplex. Esto solo admite estructuras de serialización, pero trabajaré en una estructura de datos diferente que admita el almacenamiento y la recuperación de objetos arbitrarios.

http://managedesent.codeplex.com/

3

La restricción de tipo puede ser aceptable en las claves, pero en los valores, esperaría que todo lo que sea [Serializable] funcione. De lo contrario, ¿cuál es el punto? Casos simples como Dictionary<int, string> se ven en los libros de texto con mucha más frecuencia que en el mundo real.

+2

El problema es que no puedo coincidir con la semántica del diccionario del sistema. Si agrega un objeto serializable a un diccionario, se agrega por referencia, por lo que cambiar el objeto cambia el objeto en el diccionario (son el mismo objeto). Cualquier objeto agregado a un PersistentDictionary se agregará por valor, creando un clon. Me preocupa la rareza de la API que esto generaría. –

+2

Para los tipos "básicos", la semántica aún coincidirá. Para los tipos definidos por el usuario, todavía coincidirá para tipos de valores y tipos de referencia de pseudo-valor (es decir, clases inmutables tales como 'Uri'). Incluso donde no coincida, yo diría que ese comportamiento es mucho más útil que prohibirlo abiertamente. Existe un cierto potencial de confusión allí, por supuesto, por lo que tendrá que advertir claramente sobre esto. Pero creo que la utilidad supera la simplicidad aquí. –

Cuestiones relacionadas