.NET Core 설정 파일 읽 기 방식 상세 요약

.NET Core 의 크로스 플랫폼 개발 을 바탕 으로 설정 파일 은 이전.NET Framework 에서 xml 을 사용 한 config 파일 과 달리 현 재 는 json 파일 키 로 설정 방식 을 읽 고 있 습 니 다.
인터넷 관련 자 료 를 참고 하여 다음 과 같이 요약 한다.
확장 System.configuration.configurationManager 도입
Nuget 다운로드 확장,Install-Package System.configuration.configurationManager

사용 방법:프로필 App.config 를 추가 합 니 다.읽 기 방식 이 원래.NET Framework 방식 과 일치 합 니 다.
장점:.NET Framework 기 존 설정 방식 호 환
단점:프로젝트 실행 과정 에서 App.config 파일 을 수정 하려 면 프로젝트 에서 출력 한 내용 에 영향 을 주지 않 습 니 다.Debug 는 가 져 온 값 이 확실히 변 하지 않 았 음 을 발 견 했 습 니 다.다시 컴 파일 해 야 효력 이 발생 합 니 다.
2.확장 Microsoft.Extensions.Options.ConfigurationExtensions 도입
Nuget 다운로드 확장,
Install-Package Microsoft.Extensions.Options.ConfigurationExtensions
Install-Package Microsoft.Extensions.Configuration.FileExtensions
Install-Package Microsoft.Extensions.Configuration.Json



사용방법:참조마이크로소프트 홈 페이지
장점:application.json 의 설정 파 라 메 터 를 읽 을 수 있 습 니 다.XML 을 사용 하지 않 으 면 코어 와 가 까 운 디자인 이념 이 라 고 할 수 있 습 니 다.
단점:실행 할 때 json 파일 을 수정 하여 읽 은 내용 은 변 하지 않 지만,최소한 항목 을 다시 시작 하면 수정 할 수 있 으 며,실행 할 때 json 파일 감청 을 수정 하여 감청 변 화 를 실현 할 수 있 습 니 다.원본 코드 를 보면 설정 정 보 는 AddSingleton 을 통 해 주입 되 었 지만
그러나 IOptions Change TokenSource 도 주입 되 었 기 때문에 설정 정 보 를 가 져 올 때 IOptions<>를 IOptions Monitor<>(감청 한 Option 을 통 해 정 보 를 얻 을 수 있 음)로 바 꾸 고 IOptions Monitor<>.currentValue 를 통 해 최신 설정 정 보 를 실시 간 으로 얻 을 수 있 습 니 다(수정 감청 이 있 음).
또한 이 방법 은 반 직렬 화 원 리 를 사용 하 는 것 이다.즉,설정 파일 에 대응 하 는 실체 류 가 있어 야 한다.이 느낌 은 비교적 닭 갈비 이 고 포기 해 야 한다.
3.확장 방법 을 사용자 정의 합 니 다.이 는 자신 이 작성 하 는 것 을 실현 합 니 다.원 리 는 파일 변경 여 부 를 감청 하여 Configuration 설정 을 새로 고 치 는 것 입 니 다.
원우 의 실현 을 참고 하여 구체 적 으로 효과 가 있 는 지,시간 을 들 여 실천 해 야 합 니 다원본 링크 주소코드 는 다음 과 같 습 니 다.

public class ConfigurationManager
 {
 /// <summary>
 ///     
 /// </summary>
 private static NameValueCollection _configurationCollection = new NameValueCollection();

 /// <summary>
 ///          
 /// </summary>
 private static Stack<KeyValuePair<string, FileSystemWatcher>> FileListeners = new Stack<KeyValuePair<string, FileSystemWatcher>>();

 /// <summary>
 ///     
 /// </summary>
 private static string _defaultPath = Directory.GetCurrentDirectory() + "\\appsettings.json";

 /// <summary>
 ///         
 /// </summary>
 private static string _configPath = null;

 /// <summary>
 ///        
 /// </summary>
 private static string _configSection = "AppSettings";

 /// <summary>
 ///         
 /// </summary>
 private static string _configUrlPostfix = "Url";

 /// <summary>
 ///        
 /// </summary>
 private static long _timeStamp = 0L;

 /// <summary>
 ///        ,  :AppSettings.Url
 /// </summary>
 private static string _configUrlSection { get { return _configSection + "." + _configUrlPostfix; } }


 static ConfigurationManager()
 {
  ConfigFinder(_defaultPath);
 }

 /// <summary>
 ///         
 /// </summary>
 private static void ConfigFinder(string Path)
 {
  _configPath = Path;
  JObject config_json = new JObject();
  while (config_json != null)
  {
  config_json = null;
  FileInfo config_info = new FileInfo(_configPath);
  if (!config_info.Exists) break;

  FileListeners.Push(CreateListener(config_info));
  config_json = LoadJsonFile(_configPath);
  if (config_json[_configUrlSection] != null)
   _configPath = config_json[_configUrlSection].ToString();
  else break;
  }

  if (config_json == null || config_json[_configSection] == null) return;

  LoadConfiguration();
 }

 /// <summary>
 ///         
 /// </summary>
 private static void LoadConfiguration()
 {
  FileInfo config = new FileInfo(_configPath);
  var configColltion = new NameValueCollection();
  JObject config_object = LoadJsonFile(_configPath);
  if (config_object == null || !(config_object is JObject)) return;
  
  if (config_object[_configSection]!=null)
  {
  foreach (JProperty prop in config_object[_configSection])
  {
   configColltion[prop.Name] = prop.Value.ToString();
  }
  }
  
  _configurationCollection = configColltion;
 }

 /// <summary>
 ///   Json  
 /// </summary>
 /// <param name="FilePath">    </param>
 /// <returns></returns>
 private static JObject LoadJsonFile(string FilePath)
 {
  JObject config_object = null;
  try
  {
  StreamReader sr = new StreamReader(FilePath, Encoding.Default);
  config_object = JObject.Parse(sr.ReadToEnd());
  sr.Close();
  }
  catch { }
  return config_object;
 }

 /// <summary>
 ///        
 /// </summary>
 /// <param name="info"></param>
 /// <returns></returns>
 private static KeyValuePair<string, FileSystemWatcher> CreateListener(FileInfo info)
 {

  FileSystemWatcher watcher = new FileSystemWatcher();
  watcher.BeginInit();
  watcher.Path = info.DirectoryName;
  watcher.Filter = info.Name;
  watcher.IncludeSubdirectories = false;
  watcher.EnableRaisingEvents = true;
  watcher.NotifyFilter = NotifyFilters.Attributes | NotifyFilters.CreationTime | NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.Size;
  watcher.Changed += new FileSystemEventHandler(ConfigChangeListener);
  watcher.EndInit();

  return new KeyValuePair<string, FileSystemWatcher>(info.FullName, watcher);
  
 }

 private static void ConfigChangeListener(object sender, FileSystemEventArgs e)
 {
  long time = TimeStamp();
  lock (FileListeners)
  {
  if (time > _timeStamp)
  {
   _timeStamp = time;
   if (e.FullPath != _configPath || e.FullPath == _defaultPath)
   {
   while (FileListeners.Count > 0)
   {
    var listener = FileListeners.Pop();
    listener.Value.Dispose();
    if (listener.Key == e.FullPath) break;
   }
   ConfigFinder(e.FullPath);
   }
   else
   {
   LoadConfiguration();
   }
  }
  }
 }

 private static long TimeStamp()
 {
  return (long)((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds * 100);
 }

 private static string c_configSection = null;
 public static string ConfigSection
 {
  get { return _configSection; }
  set { c_configSection = value; }
 }


 private static string c_configUrlPostfix = null;
 public static string ConfigUrlPostfix
 {
  get { return _configUrlPostfix; }
  set { c_configUrlPostfix = value; }
 }

 private static string c_defaultPath = null;
 public static string DefaultPath
 {
  get { return _defaultPath; }
  set { c_defaultPath = value; }
 }

 public static NameValueCollection AppSettings
 {
  get { return _configurationCollection; }
 }

 /// <summary>
 ///       ,     ,        ,        
 /// </summary>
 public static void RefreshConfiguration()
 {
  lock (FileListeners)
  {
  //    
  if (c_configSection != null) { _configSection = c_configSection; c_configSection = null; }
  if (c_configUrlPostfix != null) { _configUrlPostfix = c_configUrlPostfix; c_configUrlPostfix = null; }
  if (c_defaultPath != null) { _defaultPath = c_defaultPath; c_defaultPath = null; }
  //          
  while (FileListeners.Count > 0)
   FileListeners.Pop().Value.Dispose();
  ConfigFinder(_defaultPath);
  }
 }

 }
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기