我工作在一個相當大的ASP .NET Web窗體應用程序,目前主要在美國使用。我們正在將其推廣到世界其他地區,這當然意味着我們正在努力將應用程序的所有領域本地化。一般來說,我們的方法是在每個請求的開始處設置當前線程的CurrentCulture和CurrentUICulture屬性,以支持基於當前用戶區域設置的正確格式和資源提取。這是暫時改變當前線程文化的好方法嗎?
然而,在某些情況下,我們需要使用除當前用戶的文化之外的文化來運行某些代碼。例如,'用戶A'住在德國,但是爲與法國其他公司有業務往來的公司工作。當'用戶A'想爲這些法國公司創建一張發票(PDF)時,我們希望發票生成代碼以'fr-FR'文化而不是'de-DE'文化運行。
我已經考慮過很多方法,很容易做到這一點,並想知道我是否正確地做了這件事。我主要關心的是性能和線程安全。
一種方法涉及一種靜態方法,旨在用提供的文化來運行給定的任務。事情是這樣的:
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));
我也考慮創建一個類實現IDisposable這將是負責設置線程的文化,在它的構造函數然後將原始文化返回到Dispose方法中,因此您可以這樣稱呼它:
var customerCulture = new CultureInfo(currentCustomer.Locale);
using(new CultureRunner(currentCustomer.Locale))
{
invoiceService.CreateInvoice(currentCustomer.CustomerId);
}
我是否在談論全部錯誤?哪一種方法更好?
我喜歡'使用'的方法。 – 2011-04-26 16:06:52
使用方法對我來說也是最好的。 – 2011-04-26 16:08:32