Các lựa chọn thay thế cho tập tin resx là gì


9

Tôi đang phát triển một ứng dụng Windows và tôi muốn lưu trữ tất cả văn bản cho nhãn, nút radio, nút, hộp kiểm và tiêu đề cột của lưới ở một nơi. Tôi đã thử sử dụng tệp lớp, tệp xml, bảng cơ sở dữ liệu và tệp tài nguyên.

Tôi thấy rằng một tệp lớp là cách tốt nhất để lưu trữ tất cả các văn bản này, nhưng tôi muốn biết có cách nào khác không? Nếu tôi đang sử dụng một tệp lớp thì tôi sẽ phải biên dịch lại dự án nếu có bất kỳ văn bản nào thay đổi.

Một tệp tài nguyên sẽ hoạt động đúng với số lượng lớn dữ liệu? Điều gì về một từ điển hoặc lưu trữ dữ liệu trong các biến?



1
@ sandeep.gosavi - Bạn đã nói một tệp lớp là cách tốt nhất để lưu trữ thông tin và yêu cầu một cách khác. Cách khác là sử dụng tệp tài nguyên. Câu hỏi của bạn rất mơ hồ và cho thấy hầu như không có nỗ lực nghiên cứu về phía bạn.
Ramhound

2
@ sandeep.gosavi - Vì vậy, cho anh ta lựa chọn. Yêu cầu của bạn cho "cách tốt nhất" nhưng bạn đã có nó.
Ramhound

1
Liên quan, nhưng không trùng lặp: Thiết kế lớp cho đối tượng quốc tế hóa , Quốc tế hóa: Điều gì cần suy nghĩ? và các chiến lược hiệu quả để bản địa hóa trong .NET . Tôi biết bài đăng không tham chiếu rõ ràng I18N, nhưng nếu nó quẫy như một con vịt ...
Dan Pichelman

1
Vui lòng không đăng chéo stackoverflow.com/q/18531904/839401 . Câu hỏi Stack Overflow có thể đã được di chuyển. Bạn chỉ cần gắn cờ nó.
ChrisF

Câu trả lời:


5

Nói tóm lại: Nghe có vẻ như tôi là một địa phương hóa tài nguyên (các loại khác nhau như nhãn tĩnh, văn bản, v.v.). Nói chung, những thay đổi trong nội dung tệp tài nguyên không cần phải xây dựng lại ứng dụng.

Các dis-lợi thế tài nguyên lưu trữ trong các lớp học , là mỗi sự thay đổi / sửa đổi sẽ đòi hỏi một tái xây dựng các ứng dụng win-form.

Một tệp tài nguyên sẽ hoạt động đúng với số lượng lớn dữ liệu?

Tôi nghĩ rằng giới hạn là giới hạn kích thước tệp của hệ điều hành và đó là 4 GB trên hệ thống 32 Bit, nếu tôi nhớ chính xác. Đối với 64 bit, nó sẽ còn lớn hơn nữa. Dù sao, với mục đích lưu trữ văn bản tĩnh, nó là quá đủ.

Vì vậy, theo tôi, điều này không nên được thực hiện ở bất kỳ nơi nào khác nếu văn bản sẽ tĩnh.

Một cách tiếp cận khác sẽ là tạo một lớp để kiểm soát quyền truy cập vào các tệp tài nguyên của bạn. Lớp này có thể được sử dụng để lưu trữ các khóa để truy cập các tệp tài nguyên của bạn và một cách được gõ mạnh để lấy các tài nguyên có sẵn của dự án.

Một số tài liệu tham khảo về câu trả lời SE về nội địa hóa và tài nguyên:

Tài liệu tham khảo từ MSDN :


1
bạn có phiền giải thích thêm về những tài nguyên này làm gì không và tại sao bạn lại đề xuất những tài nguyên này khi trả lời câu hỏi? "Câu trả lời chỉ liên kết" không được chào đón tại Stack Exchange
gnat

@Yusubov: Tôi đã đi qua các liên kết của bạn, tài nguyên là tùy chọn tốt, nhưng tôi đang tìm kiếm bất kỳ tùy chọn nào khác.
sandeep.gosavi

1
Câu trả lời không chỉ có liên kết, nó có tuyên bố với ý kiến ​​đề xuất về giải pháp sẽ hoạt động.
Yusubov

@ sandeep.gosavi: IMHO, chọn tệp tài nguyên làm giải pháp sẽ hoạt động cho ứng dụng win-form của bạn. Thay thế bạn có thể tạo một lớp sẽ kiểm soát quyền truy cập vào tài nguyên bên ngoài của bạn.
Yusubov

@Yusubov: IMHO là gì?
sandeep.gosavi

3

Tôi nghĩ rằng bạn khá nhiều đề cập đến tất cả.
Nếu bạn muốn một cái gì đó linh hoạt, nơi bạn không cần biên dịch lại, thì DB có thể là lựa chọn tốt nhất của bạn.
Nhưng nếu không tôi sẽ đi với .resx, vì đây là tiêu chuẩn.
Lưu văn bản trong các tập tin lớp là một ý tưởng khá tồi.


2

Bên cạnh định dạng .resx, bạn cũng có thể sử dụng các tệp .txt hoặc .restext, ở định dạng đơn giản hơn (và dễ đọc và chỉnh sửa hơn).

Tạo tệp tài nguyên cho ứng dụng máy tính để bàn (xem phần "Tài nguyên trong tệp văn bản")

Các định dạng về cơ bản name = value, với khả năng có ý kiến ​​và biên soạn có điều kiện.

Một tùy chọn khác là sử dụng bất kỳ tệp nguồn hoặc tệp văn bản nào bạn muốn và xây dựng tệp .resource nhị phân theo cách thủ công hoặc là một phần của bước xây dựng. (xem "Tài nguyên trong .resrouces Files" từ liên kết ở trên).

Dù bằng cách nào, có thêm một chút công việc để đưa chúng vào dự án và biên dịch, nhưng cả hai đều có lợi ích là có hỗ trợ cho nhiều ngôn ngữ, giống như tệp .resx.


2

Trong C #, bạn gần như chắc chắn sẽ tốt hơn khi sử dụng tệp Tài nguyên (là tệp XML). Điều này mang lại cho bạn những lợi ích sau:

  • Loại bỏ cần phải biên dịch lại toàn bộ giải pháp cho những thay đổi của văn bản.
  • Cho phép quản lý chuỗi được thực hiện bởi một người nào đó không phải là lập trình viên (lập trình viên không nhất thiết phải là người tốt nhất để viết thông báo lỗi / thông tin người dùng).
  • Cho phép nội địa hóa khá tầm thường.

Vì vậy, những gì thay thế cho các tập tin .resx?
Tohid

"Loại bỏ cần phải biên dịch lại toàn bộ giải pháp cho những thay đổi của văn bản." - không, khi tài nguyên được nhúng
Konrad

1

Tôi đã có một yêu cầu tương tự trước đây và tôi đã lưu trữ tài nguyên trong tệp .resx nhưng tôi đã quyết định sử dụng các lớp để lưu trữ khóa.

Ví dụ: giả sử tôi có tài nguyên cho màn hình rút tiền ngân hàng.

Tôi đã tạo ra một lớp đơn giản trên các dòng

public class BankingWithdrawalResource
{
   public string WithdrawFunds { get; set; }
}

Sau đó tôi đã thực hiện một lớp để lấy tài nguyên. Mục tiêu của tôi là có một cách đánh máy mạnh mẽ để rút tài nguyên. Tôi cũng muốn làm cho đơn vị truy xuất tài nguyên có thể kiểm tra được. Tôi đã trích xuất một giao diện để truy xuất tài nguyên : IResource.

Mỗi lần tôi muốn sử dụng tài nguyên, tôi sẽ có một triển khai thông qua bộ chứa IoC.

var resource = Dependency.Resolve<IResource>();

Cuối cùng, khi nói đến việc sử dụng tài nguyên, tôi sẽ có vài thứ trên dòng:

resource.For<BankingWithdrawalResource>(p => p.WithdrawFunds)

Trong dòng trên, tôi đã sử dụng biểu thức lambda cho phép tôi xem tất cả các tài nguyên có sẵn thông qua intellisense.

Khi nói đến thử nghiệm đơn vị, tôi sẽ chế giễu IResourcevà đặt kỳ vọng vào nó.

Ví dụ:

resourceMock.Expect(a => a.For<BankingWithdrawalResource>(p => p.WithdrawFunds)).Repeat.Once();

Cũng lưu ý rằng chúng tôi đã trích xuất một giao diện để lấy tài nguyên. Vì điều này, giờ đây chúng tôi có thể lưu trữ tài nguyên ở bất cứ đâu chúng tôi muốn. Ví dụ:

public class DatabaseResource : IResource
{
   // Logic to retrieve resources from database
   // Won't cause recompilation
}

public class XmlResource : IResource
{
   // Logic to retrieve resources from xml files
}

public class DefaultResource : IResource
{
   // Will cause recompilation as resources are stored in .resx
}

Tôi đã viết ở trên từ đầu của tôi trong notepad, vì vậy nếu bạn có bất kỳ vấn đề gì hãy cho tôi biết và tôi sẽ thêm thực hiện sau.


Ưu điểm của việc lưu trữ tài nguyên trong các lớp là mỗi thay đổi / sửa đổi sẽ yêu cầu xây dựng lại ứng dụng dạng win
Yusubov

Tôi hơi bối rối xin vui lòng sửa cho tôi nếu tôi sai. Điều tôi hiểu là, bạn đang lưu trữ dữ liệu trong tệp tài nguyên và để truy xuất nó, bạn đang sử dụng lớp.
sandeep.gosavi

1
Bạn sẽ không thay đổi các lớp vì thay đổi các lớp có nghĩa là thay đổi các khóa tài nguyên. Nếu bạn đang thay đổi khóa tài nguyên, có nghĩa là bạn đã không nghĩ đến nó lần đầu tiên. Những gì bạn có thể thay đổi là các mục thực tế trong tệp tài nguyên, tệp xml hoặc cơ sở dữ liệu. Điều này sẽ biên dịch lại ứng dụng. Nếu các yêu cầu của bạn không cho phép biên dịch lại, thì hãy để lại hầu hết ví dụ của tôi và triển khai một nhà cung cấp tài nguyên cho cơ sở dữ liệu hoặc nguồn khác sẽ không khiến ứng dụng biên dịch lại.
CodeART

1
@ sandeep.gosavi Tôi có một lớp để lưu trữ các khóa tài nguyên và tôi có một lớp để lấy tài nguyên. Ưu điểm là tôi không còn phải sử dụng "chuỗi ma thuật" mỗi khi tôi rút tài nguyên, thay vào đó tôi nhận được một danh sách các tài nguyên có sẵn thông qua intellisense. Tôi cũng có thể dễ dàng thay thế nhà cung cấp tài nguyên của mình (từ resx đến cơ sở dữ liệu). Cuối cùng, nó dễ dàng kiểm tra được.
CodeART

1
ok tôi hiểu rồi Bạn có thể vui lòng cung cấp cho tôi mã demo không, vì tôi là người mới trong dotnet
sandeep.gosavi

1

Tôi vừa thực hiện một cái gì đó tương tự theo hướng dẫn CodeProject này: link

Nó là để tạo nhiều tệp văn bản có thể cập nhật dễ dàng thành các tệp tài nguyên mà bạn có thể thêm vào dự án của mình để có các ngôn ngữ khác nhau (trong trường hợp của tôi, hộp tổ hợp cho phép tôi thay đổi giữa nhiều ngôn ngữ mà tôi tạo tệp tài nguyên cho)

Ưu điểm của tệp này .resx là bạn chỉ có thể có 1 ngôn ngữ cho mỗi dự án, thay vì phải có 1 ngôn ngữ cho mỗi biểu mẫu

Chỉ là một cái gì đó khác để suy nghĩ về


1

Portable Object (.po) rất phổ biến và gần như là một tiêu chuẩn bên ngoài thế giới .NET. Tôi thấy nó được sử dụng trong một vài dự án C # (ví dụ: https://github.com/OrchardCMS/OrchardCore/tree/d729a2048a4390380d99e7be9f7968ff8f8e9271/src/OrchardCore/OrchardCore . Không có hỗ trợ chính thức cho nó, nhưng định dạng không phức tạp và có một số thư viện cho nó: https://github.com/neris/NGettext

Định dạng chắc chắn đơn giản hơn .resx vì nó không dựa trên XML. Bạn có nhiều công cụ cho nó, ví dụ như pootle, poedit và nhiều hơn nữa ...

Một tùy chọn khác là sử dụng một số định dạng đơn giản (hoặc tùy chỉnh) như JSON / YAML / TOML hoặc thậm chí một cái gì đó đơn giản như Key=Valuetrong văn bản gốc với một số quy ước đặt tên tệp như Locale.{languagecode2-country/regioncode2}. Sau đó, bạn có thể nhúng nó dưới dạng tài nguyên trong tập hợp của mình :) Nhưng sau đó bạn phải đưa ra công cụ dịch thuật của riêng mình hoặc một số trình chuyển đổi sang / từ po / resx để làm việc với công cụ hiện có.

Ngoài ra, .resx là cách chính thức và là lựa chọn đầu tiên để đi cùng. Công cụ cũng khá tốt: https://github.com/tom-englert/ResXResourceManager

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.