객체 지향 C#의 꽁수. Singleton 패턴.
사실 전역변수 처럼 쓰이는 각종 응용 프로그램 설정 내역들이 있다.
보통은 app.config 혹은 web.config 를 통해 값을 읽어오게 되는데,
그 로직 아무리 짧아야, 2~3줄씩 되고,
설정이 필요할 때 마다 app.config 혹은 web.config에서 일일히 읽어오는 것도 나름대로 곤욕이다.
그러기 위해 Sigleton 패턴을 사용하는게 제일인듯.
그런데, 이런 Singleton 패턴은 Windows 응용 프로그램 같은 경우야,
하나의 인스턴스니 상관 없지만, 웹 응용 프로그램같은 경우에는 조금 난감한 것도 사실.
이에 현재 나름대로 고민해서 짜본 방법이 아래와 같다.
public static class ConfigManager()
{
public static string TempFileLocation
{
get
{
string sResult = string.empty;
try
{
sResult = ConfigurationManager.AppSettings["tempfolder"];
}
catch
{
}
return sResult;
}
}
}
저렇게 만들면 ConfigManager를 일일히 new 할 필요가 없다. Heap이 아닌 응용 프로그램 저장 위치에 단 한개의 인스턴스만 존재하므로, 최소한 이 부분을 띄워주는데에서는 무조건 저 한개의 로직에서 처리가 된다.
저 방법의 핵심은 static 인데, static으로 정의되는 내용은 어쨌던 별도의 Instance 생성이 필요없다는 훌륭한 강점을 가지게 된다.
그런데, 설정 구성이 많아지게 되면 그 만큼 코드도 무척 길어지게 된다. 처음 설정 내역이 4~5개 까지는 그럭저럭 봐주는데, 설정 내용이 20여개를 넘자, 매번 저렇게 구성하는것도 환장하겠고, 더욱이 appsetting의 Key 값이 변경될때도 나름 고역.
더욱이 매번 appsetting 에서 값을 읽어오는게 영 마음에 꺼림찍했다.(NET 프레임워크 개발한 분들도 나름 천재들이니, 옵티마이징 하면, 저 로직도 나름 정리가 잘 되리라 생각은 하지만)
그럼 데이터를 1회만 읽어오고, 모두 한자리에 때려 박는 방법을 다시 생각했다.
public static class ConfigManager()
{
static ConfigManager()
{
try
{
ConfigManager.tempFolderLocation =
ConfigurationManager.AppSettings["tempfolder"];}
catch
{
}
}
static string tempFolderLocation;
public static string TempFileLocation
{
get
{
return ConfigManager.tempFolderLocation;
}
}
}
즉 static 클래스 안에 Constructor를 만들어서 그 안에서 1회 읽어오게 하고,
실제 일반 사용자가 사용하는 부분에서는 static으로 저장된 변수 값만 읽어가게 되는 것이다.
직접 XML이나, INI 파일 파서를 만든 상태라면, 그 로직을 Constructor에 만들고
구성하면 되는 것이다.
즉 핵심은 static 클래스에서 static 생성자를 만드는 것!. 이게 핵심.