2010-11-07 5 views
5

Son derece hafif ve hızlı olan SQLite kullanan bir uygulamam var. Başlangıçta yüklenmesi gerekmeyen bazı tercihlerim var, ancak kullanıcının gittiği yere bağlı olarak çeşitli zamanlarda kullanılması gerekebilir. Bu, nerede saklanacağına karar veremiyorum.C# Uygulama - veritabanı veya yapılandırma dosyasında tercihlerin saklanması?

S1: Devam etmeli ve veritabanında saklamalı mıyım? Bir yapılandırma dosyasında saklamalı mıyım?

S2: Tercihleri ​​ve diğer verileri, hemen kullanılmayacak olsalar bile, başlangıçta yükleyip depolamalı mıyım? Yoksa veritabanına ihtiyacım olduğunda sormalı mıyım?

Örnek: Uygulamam, yazılımı kullanan şirketin şirket bilgilerini depolayabilir. Şirket adı, şirket telefonu, vb. Bu bilginin kullanıldığı tek zaman, yazılımın bir harfi otomatik olarak yazdırması veya kullanıcının şirket bilgilerini programda düzenlemesidir.

DÜZENLEME: Bunun uygulama ayarlarına ve kullanıcı ayarlarına geldiğinin farkına vardım. Programımın, yazılımın kopyası başına birden çok kullanıcısı yok. Bu söylendiği gibi, bunların uygulama ayarları olacağını varsayalım.

+0

yükleme kişisel bir tercihtir. İlk ihtiyaç duyulduğunda yükleme daha hızlı bir başlangıç ​​zamanı sağlar. Singleton aramaları (ilk erişimde tek bir noktaya yüklediğiniz yerde) ihmal edilebilir bir etkidir, ancak belirli bir UI etkisine sahip olabilir. Öğeleri yüklediğinizde ve bu can sıkıcı bekleyiş ekranını aldığınızda bazı uygulamalarda aldığınız duraklamaya karşı Photoshop'un nasıl yüklendiğini (nerede UI'yi vermeden önce HERŞEYİ yükler) düşünün. – jcolebrand

+0

@drachenstem Ayrıca, arka planda bir şeyler yükleyebilir ve yüklenmemişse, kullanıcının yüklenmesini bekleyebilirsiniz. Visual Studio'ya çok benziyor. Bazen dokümantasyon önbellek inşa edilmez, ancak –

+0

Çok doğru gerekiyorsa olacak, ama çoğunlukla, ben yükleme olacağım veri boyutu çok küçük, kullanıcı bile fark olmamalıdır. – OogaBooga

cevap

3

Kaydetmek için kaç ayar arıyorsunuz? Yerleşik ayar özelliğini kullanmak oldukça acısızdır. Bir dosyada

http://msdn.microsoft.com/en-us/library/aa730869.aspx

+0

Aslında pek fazla değil. Bunu hiç duymadım ... Okumak istiyorum. – OogaBooga

+0

Bunu "Kullanıcı" ayarları için önermem, sadece "Uygulama" ayarları. "Kullanıcı" ayarlarını kullanırsanız, değerler, uygulamanın her bir sürümü için değiştiren tuhaf bir katlama listesinde APPDATA klasöründe saklanır, böylece kullanıcı yükseltilirse, önceki tüm ayarları kaybolur. –

+0

Bunun, uygulama ayarlarına ve kullanıcı ayarlarına geldiğinin farkına vardım. Programımın, yazılımın kopyası başına birden çok kullanıcısı yok. Bu söylendiği gibi, bunların uygulama ayarları olacağını varsayalım. Bu durumda, JTA'nın cevabının benim sorunum için en iyi olacağını düşünüyorum. Bunun neden böyle bir sebebi olursa, lütfen bana bildirin! – OogaBooga

1

saklanması yapılandırma verileri nadiren değiştirmek hafif ayarları için iyidir. Genellikle bunu geliştirme ve üretim arasında farklı olan ve uygulamanızı çalışır duruma getirmek için kullanılan ayarlar için yaparsınız.

Bundan sonra, her şey bir veritabanında saklanır. Bu, ayarları değiştirmek, gerektiğinde yüklemek, yükseltmeler sırasında sisteminize kaydetmek, birden fazla ön uç kullanıyorsanız (mevcut yapılandırmada bir dosyaya kaydetme ve tüm ön tarafa karşı koruma sağlama) size iyi bir kullanıcı arabirimi seçeneği sunar. -end'ler aynı güncel dosyalara sahiptir.)

3

Yapmak isteyebileceğiniz şey, ayarları enkapsüle eden ve bunları Hashtable içine okuyan bir sınıf yazmaktır.

Adı temel alan bir ayarı görüntüleyen temel GetSetting yönteminiz olabilir. Ayar, Hashtable'da bulunuyorsa, değeri döndürün, aksi halde ayarı bulmak için DB'ye gidin ve ardından Hashtable'da saklayın. Daha sonra, istediğiniz her ayar için GetSetting/SetSetting yöntemlerini çağıran ayrı özellikler yazabilirsiniz.

Bu, DB'deki ayarları kolayca saklamanızı ve DB'yi sürekli olarak okumayı önlemek için okumaları önbelleğe almanızı sağlar.

public class Settings { 
    private object SyncRoot = new object(); 
    private System.Collections.Hashtable _cache = new System.Collections.Hashtable(); 

    public T GetSetting<T>(string xPath, T defaultValue) 
    { 
     lock (SyncRoot) 
     { 
      if (!_cache.ContainsKey(xPath)) 
      { 
       T val = GetSettingFromDB<T>(xPath, defaultValue); 
       _cache[xPath] = val; 
       return val; 
      } 
      return (T)_cache[xPath]; 
     } 
    } 

    public T GetSettingFromDB<T>(string xPath, T defaultValue) 
    { 
     // Read from DB 
    } 

    public void SaveSetting<T>(string xPath, T value) 
    { 
     lock (SyncRoot) 
     { 
      if (_cache.ContainsKey(xPath)) 
       _cache[xPath] = value; 
     } 

     SaveSettingToDB<T>(xPath, value); 
    } 

    public T SaveSettingToDB<T>(string xPath, T defaultValue) 
    { 
     // Read from DB 
    } 
} 

Sonra sadece böyle özelliklerinin bir grup ile bir sınıf oluşturmak:

public static bool BooleanFeature 
    { 
     get { return Settings.GetSetting<bool>("BooleanFeature", true); } 
     set { Settings.SaveSetting<bool>("BooleanFeature", value); } 
    } 

Artık kodda yapabilirsiniz: JTAs ek olarak

if (Setting.BooleanFeature) { 
    // Run certain code 
else { 
    // Run other code 
} 
+0

Ben senin derinlik açıklama ve kod örnekleri takdir ediyorum, ama JTA yayınının altında benim yorum devletler olarak, ben en iyi onun çözüm uygulama ayarları olurdu ayarlarımı verilen kullanmak için uygun olacağını düşünüyorum. – OogaBooga

0

yapardım cevap eklediğim gibi 3 yöntem kullandım ve hepsinin yukarı ve aşağı tarafları var.

  1. saklamak, yerleşik bir aslında çalıştıran kullanıcıya kilitleyin gelmez. birden fazla kullanıcı uygulamasını kullanıyorsanız mesela Yani, orada her kullanıcının bağımsız ayarlar olacaktır. İstediğiniz buysa, bunu seçin.
  2. Veritabanında saklamak, bir kullanıcıya bağlı olmak yerine veritabanına bağlanmak istemiyorsanız, yararlıdır. Bu ayarları, uygulamanın dışından değiştiremezsiniz.

  3. Ben bir xml-düzenleyicisi ile düzenlemek için gerekirse ben XML ile serialize bir yapılandırma sınıf kullandım. Örneğin, , bir hizmet çalıştırıyorsanız, kullanıyorsanız çok kullanışlıdır. Uygulama başlangıcında üzerinde yükleme karşı ilk zamana ihtiyacı