이번에 알아 볼 것은 리소스 관리 입니다.
이미 예전에 리소스 관련된 글을 쓴적이 있습니다.
http://bangsil.net/MyPosts/DotNet/1a654797-8893-4c7c-9e93-c979ad67b2fa
기본적으로 리소스는 하나의 프로젝트의 Properties 라는 폴더의 하위에 위치하게 됩니다.
이 리소스는 이미지나 문자열 아이콘 파일등등 어느 것이든 가능합니다.
여러개의 프로젝트가 있는 솔루션의 경우에는 각 프로젝트마다 그 프로젝트에 해당되는 리소스가 존재하게 될테고 이를 관리 하는 것은 참 까탈스럽습니다.
그래서 이렇게 뿔뿔이 흩어져 있는 리소스를 하나의 프로젝트로 모아서 관리 할 수 있는 방법은 없을까 하고 고민하게 되었습니다.
기본적인 샘플은 위 링크에서 다운 받아서 테스트 해 보시기 바랍니다.
그리고 위 링크에서 사용되었던 버전과 달라진 점이라면 자주쓰는 데이터는 CommonMessage 형태로 따로 뽑아 두었습니다. 대부분 인증이나 게시판 관려 메시지가 되겠네요..
우선 하나씩 살펴 보도록 하겠습니다.
public enum ResourceType
{
///
/// 아이콘 타입입니다.
///
Icon = 0,
///
/// 문자열 타입입니다.
///
String,
///
/// 이미지 타입입니다.
///
Image,
///
/// Object 타입입니다.
///
Object
}
이 어셈블리를 이용하여 사용할 수 있는 리소스 형식은 위와 같습니다.
이 어셈블리에는 중요한 클래스가 2개가 있습니다.
그중 하나는 CommonLocalizedEnumConvertoer 이며 또 하나는 CustomResourceManager 클래스입니다.
전자의 경우에는 열거형을 지역화 하는 경우에 사용하는 클래스입니다. 후자의 경우는 열거형이 아닌 경우에 사용하는 클래스입니다.
후자의 경우에는 별도로 Proxy 클래스가 필요로 합니다. 이 글의 첫 링크에 있는 예제는 바로 후자의 것이 되겠네요.
우선 CumstomResourceManager 클래스를 이용하는 법을 알아 봅시다.
public CustomResourceManager(ResourceType resourceType, Type type)
{
bool hasResource = false;
Assembly asm = Assembly.GetCallingAssembly();
string resourceName = asm.GetName().Name + ".Resources."
+ type.Namespace + "." + resourceType.ToString();
foreach (string reName in asm.GetManifestResourceNames())
{
if (reName.Substring(0, reName.LastIndexOf('.')) == resourceName)
{
hasResource = true;
break;
}
}
if (!hasResource)
{
throw new MissingManifestResourceException("해당 타입의 리소스를 찾을 수 없습니다.");
}
else
{
rm = new ResourceManager(resourceName, asm);
}
}
ResourceType은 앞서 보았던 열거형입니다.
즉 매개변수로 해당 리소스 파일이 있는지 찾고 찾게 되면 ResourceManger 의 인스턴스를 생성하는 코드가 되겠습니다.
이 룰에 적합하게 하기 위해서는 리소스파일의 경우 {네임스페이스}.String.{CultureCode(생략가능)}.resources 형식이 되어야 합니다.
또 다른 생성자는 각 네임스페이스의 리소스가 아니라 공용리소스를 생성하기위한 생성자입니다.
이 클래스에는 리소스를 가져오는 여러 메서드가 있습니다만 대동소이합니다.
예를 들어 리소스를 문자열로 가져오기 위해서는 GetString 메서드를 호출합니다 코드는 아래와 같습니다.
public string GetString(string key)
{
if (key.Length == 0)
{
return null;
}
try
{
return rm.GetString(key);
}
catch
{
return null;
}
}
이제 실제로 사용해보도록 하겠습니다.
앞서 잠깐 언급했듯이 이 클래스를 이용하기 위해서는 Proxy 클래스가 필요합니다.
예를 들어 I-Shop 이라는 쇼핑몰 프로젝트를 한다고 칩니다.
그러면 이 솔루션에 해당되는 리소스를 담당하는 하나의 프로젝트를 생성합니다.
예를 들면 IShop.Resources 라는 프로젝트가 되겠습니다.
이 프로젝트는 RPNetworks.Resources 어셈블리를 참조해야 합니다.
프로젝트를 생성했으면 우선 리소스 파일을 생성합니다. 리소스 파일은 Resourcer.net 을 이용하면 편리합니다.
예를 들어 IShop.Web 이라는 프로젝트의 리소스 파일을 생성한다고 칩시다.
리소스 파일의 이름은 IShop.Web.String.resources 가 되겠습니다. 만약 영문이라면 IShop.Web.String.en.resources 가 될테고 문자열리소스가 아니라 이미지 리소스 라면 ISHop.Web.Image.resources 가 될것입니다.
이제 이 프로젝트에 proxy 클래스를 만들어 보겠습니다.
namespace IShop.Web
{
public class StringProxy
{
private static CustomResourceManager rm;
///
/// 클래스의 정적 생성자입니다.
///
static StringProxy()
{
rm = new CustomResourceManager(ResourceType.String, typeof(StringProxy));
}
public static string Download_Migration_01
{
get { return rm.GetString("Download_Migration_01"); }
}
}
}
1행을 보면 IShop.Web 입니다.
네임스페이스는 현재 네임스페이스가 아니라 이 리소스를 사용할 곳의 네임스페이스를 지정해 주어야 합니다.
IShop.Web 이라는 프로젝트의 문자열 리소스 Proxy 클래스라는 의미가 되겠습니다.
이렇게 proxy 클래스를 생성하게 되면 코드에서는 StringProxy.Download_Migration_01 처럼 사용할 수 있게 됩니다.
간단하지욤?
다음에는 열거형을 사용하는 법을 알아 보도록 하겠습니다.