C# - config-r
개요
- scripts와 Roslyn을 사용하여 스크립트 방식의 설정 파일을 사용할 수 있다.
- 저장소 https://github.com/config-r/config-r
- NuGet으로 설치
Quickstart
- NuGet으로 설치
- 실행 파일과 같은 이름의 .csx 파일을 프로젝트에 추가(예 실행파일 이름이 ConsoleApplication1.exe 라면 ConsoleApplication1.exe.csx). 추가한 파일의 프로젝트 속성 ‘Copy to Output Directory’에서 Web 프로젝트는 복사 안함, 그 외 프로젝트는 항상 복사로 설정한다.
// ConsoleApplication1.exe.csx
// regular C#, no restrictions!*
Add("Count", 123);
Add("Uri", new Uri("https://github.com/config-r/config-r"));
// program.cs
void Main(string[] args)
{
var count = Config.Global.Get<int>("Count"); // it's a System.Int32!
var uri = Config.Global.Get<Uri>("Uri"); // it's a System.Uri!
Console.WriteLine("Count: {0}", count);
Console.WriteLine("Uri: {0}", uri);
}
config-r을 라이브러리 프로젝트에서 설치했다면 .csx 파일을 실행 파일 프로젝트에 추가하면 된다.
설정 파일 위치 변경
- 기본적인 방법
Config.Global.LoadScriptFile("path/to/MyConfig.csx");
- 웹상에 있는 설정 파일 사용
Config.Global.LoadWebScript(new Uri(
"https://gist.github.com/adamralph/6843899/raw/8cfdb09ad00655edb389cb0761aca44fb24f83fb/sample-config2.csx"));
- 복수의 파일 로딩
Config.Global.LoadScriptFile("Custom1.csx").LoadScriptFile("Custom2.csx");
- 로딩한 스크립트 파일 언로드
Config.Global.Unload();
동적으로 어셈블리 로딩
// MyApp.exe
var assembly = typeof(Foo).Assembly; // Alternatively Assembly.Load("Path to assembly");
Config.GlobalAutoLoadingReferences.Add(assembly);
var myConfigItem = Config.Global.Get<object>("myconfigitem");
// MyApp.csx
Add("myconfigitem", new SomeTypeFromTheFooAssembly());
스크립트 파일의 위치를 지정
// MyApp.exe
var assembly = typeof(Foo).Assembly;
Config.Global.LoadScriptFile("\\path\to\MyConfig.csx", assembly);
var myConfigItem = Config.Global.Get<object>("myconfigitem");
기능
원격에 있는 스크립트 실행
Load("\\configserver\configshare\{app name}\{machine name}.csx");
var foo = Configurator.Get<int>("foo");
key-value
Add("The Answer to Life, The Universe, and Everything", 42);
var answer = Config.Global.Get<int>("The Answer to Life, The Universe, and Everything");
다른 파일에서 데이터 로딩
Custom2.Data.csx
var count = 345;
var uri = new Uri("https://github.com/config-r/config-r/foobarbazfoobarbaz");
var fromCustom1File = false;
var fromCustom2File = true;
Custom2.csx
#load "Custom2.Data.csx"
Add("Count", count);
Add("Uri", uri);
Add("FromCustom1File", fromCustom1File);
Add("FromCustom2File", fromCustom2File);
Load("Custom3.csx");
Custom3.csx
Add("Count", 456);
Add("Uri", new Uri("https://github.com/config-r/config-r/foobarbaz"));
Add("FromCustom1File", false);
Add("FromCustom2File", false);
Add("FromCustom3File", true);
호스트 프로젝트에서 정의한 클래스 생성
#r "ConfigR.Samples.ConsoleApplication.exe"
using ConfigR.Samples.ConsoleApplication;
Add("Foo", new Foo { Bar = "Baz" }); // the Foo class is defined in the applicaton!
호스트에서 생성한 객체 사용하기
Add("Bar", Configurator.Get<int>("Foo") * 2); // the 'Foo' value was added in the application!
스크립트로 작업 스케쥴링 하기
#r "ConfigR.Samples.Scheduler.exe"
#r "Common.Logging.Core.dll"
using System;
using Common.Logging;
using ConfigR.Samples.Scheduler;
Add(
"Schedules",
new[]
{
new Schedule
{
Action = () =>
{
LogManager.GetCurrentClassLogger().Info("The 1st schedule is sending some emails!");
// send some emails
},
NextRun = DateTime.Now.AddSeconds(2),
RepeatInterval = TimeSpan.FromSeconds(4),
},
new Schedule
{
Action = () =>
{
LogManager.GetCurrentClassLogger().Info("The 2nd schedule is downloading some reports!");
// download some reports
},
NextRun = DateTime.Now.AddSeconds(3),
RepeatInterval = TimeSpan.FromSeconds(4),
},
new Schedule
{
Action = () =>
{
LogManager.GetCurrentClassLogger().Info("The 3rd schedule is performing some housekeeping!");
// perform some housekeeping
},
NextRun = DateTime.Now.AddSeconds(4),
RepeatInterval = TimeSpan.FromSeconds(4),
}
});
이 글은 2019-04-05에 작성되었습니다.