과거에 몇 번 코드에 데이터를 저장하고 싶었습니다. 데이터는 거의 변경되지 않으며 데이터베이스에 대한 액세스가 불가능하거나 실용적이거나 바람직하지 않은 장소에서 사용됩니다. 작은 예는 국가 목록을 저장하는 것입니다. 이를 위해 다음과 같은 작업을 수행 할 수 있습니다.
public class Country
{
public string Code { get; set; }
public string EnglishName {get;set;}
}
public static class CountryHelper
{
public static List<Country> Countries = new List<Country>
{
new Country {Code = "AU", EnglishName = "Australia"},
...
new Country {Code = "SE", EnglishName = "Sweden"},
...
};
public static Country GetByCode(string code)
{
return Countries.Single(c => c.Code == code);
}
}
데이터 세트가 비교적 작고 객체가 매우 단순하기 때문에 과거 에이 작업을 수행하지 않았습니다. 이제 더 복잡한 객체 (각각 5-10 개의 속성, 일부 속성은 사전 임)와 총 200 개의 객체가있는 작업을하고 있습니다.
데이터 자체는 거의 변경되지 않으며 변경 될 때 실제로 그렇게 중요하지도 않습니다. 따라서 다음 릴리스 버전으로 롤링하는 것이 좋습니다.
데이터 소스를 어셈블리에 정적으로 저장된 것으로 변환하기 위해 T4 또는 ERB 또는 다른 템플릿 솔루션을 사용할 계획입니다.
내 옵션은 것 같다
- 데이터를 XML로 저장하십시오. XML 파일을 어셈블리 리소스로 컴파일하십시오. 필요에 따라 데이터를로드하고, 반복 사용 성능을 위해로드 된 데이터를 사전에 저장하십시오.
- 시작시 초기화되는 일종의 정적 객체를 생성합니다.
나는 옵션 1의 성능 영향을 이해한다고 확신합니다. 적어도 제 직감은 별다른 성능이 없다는 것입니다.
옵션 2는 무엇을 해야할지 모르겠습니다. 이 데이터를 실제로 C # 코드에 저장하는 가장 좋은 방법과 초기화하는 가장 좋은 방법을 알기 위해서는 .NET 프레임 워크의 내부에 대해 충분히 알지 못합니다. System.Globalization.CultureInfo.GetCulture(name)실제로 .NET 리플렉터를 사용하여 작동 방식 을 확인했습니다. 실제로 내가 원하는 것과 매우 유사한 워크 플로우이기 때문입니다. 불행히도 그 흔적은에서 끝났 extern으므로 아무런 힌트도 없습니다. 예제와 같이 모든 데이터로 정적 속성을 초기화하고 있습니까? 또는 필요에 따라 객체를 만든 다음 캐시하는 것이 더 좋을까요?
private static readonly Dictionary<string, Country> Cache = new Dictionary<string,Country>();
public static Country GetByCode(string code)
{
if (!Cache.ContainsKey(code))
return Cache[code];
return (Cache[code] = CreateCountry(code));
}
internal static Country CreateCountry(string code)
{
if (code == "AU")
return new Country {Code = "AU", EnglishName = "Australia"};
...
if (code == "SE")
return new Country {Code = "SE", EnglishName = "Sweden"};
...
throw new CountryNotFoundException();
}
정적 멤버에서 한 번에 만들면 LINQ 또는 다른 것을 사용하여 모든 개체를보고 원하는 경우 쿼리 할 수 있다는 이점이 있습니다. 이 작업을 수행하면 시작 성능이 저하되는 것으로 의심됩니다. 나는 누군가가 이것에 경험이 있고 그들의 의견을 공유 할 수 있기를 바랍니다!