2008-09-27 34 views
6

Tôi hiện đang viết một giao diện để cho phép các ứng dụng gửi dữ liệu ngoại lệ đến một kho lưu trữ trung tâm cho các mục đích hỗ trợ. Tôi đang ở tình trạng khó khăn về cách chuyển dữ liệu theo ngữ cảnh bổ sung:IDictionary <string, string> hoặc NameValueCollection

public interface IExceptionNotifier 
{ 
    void Notify(Exception ex, NameValueCollection context); //this  
    void Notify(Exception ex, IDictionary<string, string> context); //or this 
} 

Tôi thường thấy mình là vị trí tương tự khi tạo tra cứu. Bỏ qua liệu khái niệm trình thông báo ngoại lệ có tốt hay không, tốt nhất là sử dụng một số IDictionary<string, string> hoặc NameValueCollection? Tại sao bạn lại chọn cái kia?

Trả lời

1

Nếu bối cảnh là giá trị ném đi và (ở đây là phần quan trọng) sẽ không được đăng theo thứ tự, ví dụ: để gửi dữ liệu đến một hệ thống khác, tôi sẽ sử dụng IDictionary vì nó làm cho việc sử dụng giao diện của bạn linh hoạt hơn.

Nếu, mặt khác, ngữ cảnh sẽ được lưu giữ mọi lúc hoặc ngữ cảnh sẽ được sắp xếp theo thứ tự, sử dụng NameValueCollection vì bạn sẽ kiểm soát được những gì bạn thực sự sẽ nhận được từ người gọi.

Chỉnh sửa: mausch đúng ở chỗ bạn nên sử dụng phương pháp chung, nhưng tôi vẫn sẽ không sử dụng giao diện nếu bạn muốn tuần tự hóa dữ liệu.

+0

Bạn có thể mở rộng "kiểm soát những gì bạn thực sự sẽ nhận được từ người gọi của mình" không? Khả năng người gọi gửi các khóa trùng lặp có phải là vấn đề không? Tôi đoán tôi không hoàn toàn hiểu tại sao bạn nên tránh một từ điển nếu serialization có liên quan. –

+1

@JeffBridgman: Điều này đã gần mười năm trước, tôi không thực sự nhớ những gì tôi có ý nghĩa;) Tôi đoán nó về việc nhận được một đối tượng của một lớp cụ thể (tức là với một số hạn chế như hỗ trợ serialization), hoặc nhận được * bất cứ điều gì * với một giao diện nhất định. Ví dụ, việc thực hiện IDictionary có thể không hỗ trợ tuần tự hóa hoặc một số phương thức, trong khi NameValueCollection là một triển khai cố định, vì vậy nó phụ thuộc vào những gì bạn muốn làm với ngữ cảnh. Lưu ý rằng có một số câu hỏi khác về điều này trên SO với các cuộc thảo luận thú vị. – OregonGhost

5

(Giả sử .NET 3.5 tại đây. Pre .NET 3.5, NameValueCollection sẽ có lợi ích của việc có thể để buộc nhiều giá trị cho một phím, không có tương đương trực tiếp trong bộ sưu tập "bình thường".)

Bạn có muốn khóa để có nhiều giá trị tiềm năng? Nếu vậy, tôi sẽ xem xét ILookup < TKey, TValue>. Nếu không, tôi sẽ tìm IDictionary < TKey, TValue>.

Ngoài bất cứ thứ gì khác, nếu người nhận muốn thực hiện bất kỳ quá trình xử lý nào mà LINQ sẽ được sử dụng cho họ, một trong hai giao diện chung sẽ đẹp hơn NameValuePair. Tương tự như vậy, người gọi có thể dễ dàng tạo ra một từ điển/tra cứu bằng LINQ nếu họ đã có một loại ngữ cảnh chung hoặc động.

Các vấn đề liên quan