2009-09-03 9 views
6

Wdrażam ogólne, trwałe kolekcje .NET oparte na silniku bazy danych ESENT (przy użyciu warstwy interopowej ManagedEsent). Do tej pory koncentrowałem się na klasach, które dokładnie naśladują ich odpowiedniki System.Collections.Generic, z tym wyjątkiem, że pobierają ścieżkę do konstruktora, wskazując miejsce, w którym powinna się znajdować baza danych. Kod jak to działa:Czego ludzie oczekują od trwałego słownika .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(); 
    } 
} 

moje pytania są następujące:

  • Inne niż kompatybilności ze stosu, kolejki i hasła, jakie funkcje ma ludzi chce/potrzeby w kolekcjach trwało?
  • Czy muszę wymagać wersji 2.0 lub wersji 3.5 platformy .NET?
  • Typy kluczy i wartości są ograniczone do podstawowych typów .NET (bool, byte, [wszystkie liczby całkowite], float, double, Guid, DateTime i string). Mogę dodać obsługę wartości, które są serializowalne struktur. Czy ograniczenie tego typu jest zbyt bolesne?
  • Jakiego rodzaju testy wydajności chcą ludzie?
  • Do jakich aplikacji ludzie chcą używać PersistedDictionary?

Pierwsza wersja będzie gotowa w przyszłym tygodniu, ale chcę się upewnić, że robię to, co trzeba.

+0

Nawiasem mówiąc, 'System.Decimal' to również podstawowy typ w pewnym sensie (nie tak daleko, jak CLR jest zaniepokojony, ale na pewno w miarę dowolny C# lub VB deweloper jest zainteresowany). –

+0

Czy nie powinno to być wiki społeczności? –

+1

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

Odpowiedz

4

Opublikowałem PersistentDictionary na Codeplex. Obsługuje to tylko struktury szeregujące, ale będę pracował na innej strukturze danych, która obsługuje przechowywanie i pobieranie dowolnych obiektów.

http://managedesent.codeplex.com/

3

Ograniczenia typu mogą być dopuszczalne na klawiszach, ale na wartościach, oczekiwałbym, że wszystko, co jest [Serializable], zadziała. W przeciwnym razie, o co chodzi? Proste przypadki, takie jak Dictionary<int, string>, występują w podręcznikach znacznie częściej niż w prawdziwym świecie.

+2

Problem polega na tym, że nie mogę dopasować semantyki słownika systemowego. Jeśli dodasz obiekt do serializacji do słownika, zostanie on dodany przez odniesienie, więc zmiana obiektu spowoduje zmianę obiektu w słowniku (są to te same obiekty). Każdy obiekt dodany do PersistentDictionary zostanie dodany przez wartość, tworząc klon. Martwię się o dziwność API, która by ją wygenerowała. –

+2

W przypadku "podstawowych" typów semantyka nadal będzie pasować. W przypadku typów zdefiniowanych przez użytkownika nadal będzie pasować do typów wartości i typów referencji pseudo-wartości (tj. Niezmiennych klas, takich jak 'Uri'). Nawet tam, gdzie to nie pasuje, twierdzę, że takie zachowanie jest nadal znacznie bardziej użyteczne niż zabronienie tego wprost. Oczywiście istnieje pewna możliwość wprowadzenia w błąd, dlatego będziesz musiał wyraźnie o tym ostrzec. Sądzę jednak, że użyteczność przynosi tutaj prostotę. –

Powiązane problemy