저는 현재 주로 미국에서 사용되는 상당히 큰 ASP .NET Web Forms 응용 프로그램에서 작업합니다. 우리는 현재 세계의 다른 지역으로 옮겨 가고 있습니다. 물론 현재 우리는 응용 프로그램의 모든 영역을 현지화하기 위해 노력하고 있습니다. 일반적으로 우리의 접근 방식은 현재 스레드의 CurrentCulture 및 CurrentUICulture 속성을 각 요청의 시작 부분에 설정하여 현재 사용자의 로켈을 기반으로 적절한 형식 및 자원 추출을 지원하는 것입니다.일시적으로 현재 스레드의 culture를 변경하는 좋은 방법입니까?
그러나 현재 우리는 현재 사용자의 문화권 이외의 문화권을 사용하여 특정 비트의 코드를 실행해야하는 경우가 있습니다. 예를 들어 'User A'는 독일에 거주하지만 프랑스의 다른 회사와 비즈니스를하는 회사에서 근무합니다. '사용자 A'가 해당 프랑스 회사 중 하나에 대해 인보이스 (PDF)를 작성하려는 경우 해당 송장 생성 코드가 'de-DE'문화보다는 'fr-FR'문화로 실행되기를 바랍니다.
나는이 작업을 쉽게 수행 할 수있는 몇 가지 방법을 고려해 왔으며 올바르게 적용 할 것인지 궁금해하고 있습니다. 나의 주요 관심사는 성능과 스레드 안전성에 관한 것입니다.
하나의 접근법은 제공되는 문화권으로 주어진 작업을 실행하도록 설계된 정적 방법을 포함합니다. 이런 식으로 뭔가 :
public static void RunWithCulture(CultureInfo culture, Action task)
{
if (culture == null)
throw new ArgumentNullException("culture");
var originalCulture = new
{
Culture = Thread.CurrentThread.CurrentCulture,
UICulture = Thread.CurrentThread.CurrentUICulture
};
try
{
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
task();
}
finally
{
Thread.CurrentThread.CurrentCulture = originalCulture.Culture;
Thread.CurrentThread.CurrentUICulture = originalCulture.UICulture;
}
}
이 방법은 다음과 같이 호출 할 수 있습니다 :
var customerCulture = new CultureInfo(currentCustomer.Locale);
CultureRunner.RunWithCulture(customerCulture,() => invoiceService.CreateInvoice(currentCustomer.CustomerId));
나는 또한 그것의 ctor의에서 스레드 문화를 설정하기위한 책임을 질 것으로 IDisposable을 구현하는 클래스를 만들 생각했습니다 그리고 Dispose 메서드로 원 문화를 되 돌리는 것이므로 다음과 같이 호출 할 수 있습니다.
var customerCulture = new CultureInfo(currentCustomer.Locale);
using(new CultureRunner(currentCustomer.Locale))
{
invoiceService.CreateInvoice(currentCustomer.CustomerId);
}
나는이 모든 것을 잘못 알고 있습니까? 어느 접근법이 바람직할까요?
나는 '사용하는'접근법을 좋아합니다. –
사용 방법이 나에게 가장 좋은 방법이기도합니다. –