2010-11-20 8 views
2

Ich habe eine Settings.cs-Klasse, die einige statische Eigenschaften verfügbar macht. Diese Eigenschaften sind schreibgeschützt. Diese Klasse befindet sich in einer separaten DLL als die Website.Einstellungen Klasse in Website

Beim Start der Anwendung muss ich die Settings.cs-Klasse initialisieren und die statischen Eigenschaften mit Werten füllen. Dies muss einmal pro Anwendungsstart erfolgen.

Ich bin mit dem Ereignis Application_Start in der Webanwendung hängen. Wie kann ich auf diese "privaten" statischen Eigenschaften in der Klasse Settings.cs (in einer separaten DLL) zugreifen?

Ich habe eine Option, die die Settings.cs-Klasse selbst ausfüllen kann. Aber wieder muss ich das einmal pro Anwendungsstart machen.

Gibt es ein Entwurfsmuster, um so einen Fall zu behandeln?

Danke Grüße

Antwort

1
public class Settings 
{ 
    const string SettingPath = "Settings"; 
    public static Settings Instance 
    { 
     get 
     { 
      var result = HttpContext.Application[SettingPath] as Settings; 
      if (result == null) 
      { 
       var result = new Settings(); 
       HttpContext.Current.Application[SettingPath] = result; 
      } 
      return result; 
     } 
    } 

    private Settings() 
    { 
     // Load properies here 
    } 

    // Properties Here 
} 

Und wenn Sie Einstellungen nur pro Session speichern müssen - dann verwenden HttpContext.Current.Session [ „SessionSetting“]

+0

Die Situation ist anders: Settings.cs befindet sich in DLL-1 Innerhalb Application_Start Ereignis, muss ich die Eigenschaften der Klasse Einstellungen füllen. Ich bin nicht nach dem Setzen von Einstellungen in Application-Objekt. Dank – Bill

1

Anstatt programmatisch die Einstellungen von der Einstellung Application_Start Ereignis, stattdessen haben die Einstellungen deklarativ in Web.config angegeben. Die Settings Klasse würde dann lesen und diese Werte von Web.config zurückgeben.

Es wäre so etwas wie dies gehen ... in Web.config können Sie die Werte für die Einstellungen im <appSettings /> Abschnitt definieren:

<configuration> 
    <appSettings> 
     <add key="Setting1" value="..." /> 
     <add key="Setting2" value="..." /> 
     ... 
     <add key="SettingN" value="..." /> 
    </appSettings> 

    ... 
</configuration> 

Natürlich, anstatt Setting1, Setting2, und so weiter, würden Sie Verwenden Sie aussagekräftigere Namen für Ihre Einstellungen.

In Ihrem Settings Klasse Ihren Code wie folgt aussehen:

using System.Configuration; 

public class Settings 
{ 
    public int Setting1 
    { 
     get 
     { 
      return Convert.ToInt32(ConfigurationManage.AppSettings["Setting1"]); 
     } 
    } 

    public string Setting2 
    { 
     get 
     { 
      return ConfigurationManage.AppSettings["Setting1"]; 
     } 
    } 

    ... 
} 

Hinweis, die einen Wert in <appSettings> Sie ConfigurationManage.AppSettings["settingName"] verwenden zu lesen. Dadurch wird die value der benannten App-Einstellung als Zeichenfolge zurückgegeben. Wenn also bestimmte Eigenschaften Integer, Booleans oder andere Typen sind, müssen Sie sie entsprechend konvertieren, wie ich es oben mit Setting1 getan habe.

Weitere Informationen zur Verwendung des Abschnitts <appSettings> finden Sie unter AppSettings in Web.config.

Fröhliche Programmierung!

+0

Hallo Scott, lassen Sie mich erklären, was ich danach bin, vielleicht wird es klarer.Ich habe eine settings.cs Klasse enthält Eigenschaften des Typs "Interfaces" .Ich verwende Unity, um meine Standard-Implementierungen von denen zu definieren Schnittstellen. Ich muss die settings.cs einmal beim application_start initialisieren, initialisiert bedeutet, dass die Implementierung der Schnittstelle aufgelöst wird. Ich habe jedoch einen Bootstrapper in application_start, der mehrere Dinge erledigt und dann die Objekte auflöst.Was ich möchte ist, die Eigenschaften RO-Eigenschaften zu behalten, jedoch in der Lage zu sein, sie einmal zu füllen und nicht bei jeder weiteren Anfrage, um Perf zu verbessern. Vielen Dank – Bill

Verwandte Themen