2008-12-01 16 views
9

Trong khi kiểm tra bộ sưu tập chung trong .net i tìm thấy về KeyedByTypeCollection. Mặc dù tôi đã làm việc với nó và đã biết làm thế nào để sử dụng nó, tôi đã không nhận được trong đó kịch bản nó sẽ hữu ích.Sử dụng KeyedByTypeCollection trong .Net?

Tôi đọc qua ServiceProvider, cache etc. done with generics without cast, nhưng không thể nhận được nhiều.

Tôi nghĩ, phải có lý do tại sao nó được đưa vào khung .Net. Bất kỳ cơ thể nào đã sử dụng KeyedByTypeCollection đều có thể giải thích cho tôi lý do tại sao họ sử dụng nó hoặc bất kỳ cơ thể nào, nếu họ biết kịch bản nào có thể được sử dụng, có thể giải thích cho tôi.

Càng nhiều sự tò mò thì bất kỳ ngôn ngữ nào khác đều hỗ trợ loại bộ sưu tập này?

Trả lời

13

AFAIK, bộ sưu tập chung này phục vụ như một trình bao bọc đơn giản cho KeyedCollection<KEY,VALUE> khi KEY là Loại của VALUE để lưu trữ.

Ví dụ, nó là rất thuận sử dụng bộ sưu tập này nếu bạn muốn thực hiện một nhà máy trở về độc thân:

public class Factory<T> 
{ 
    private readonly KeyedByTypeCollection<T> _singletons = new KeyedByTypeCollection<T>(); 

    public V GetSingleton<V>() where V : T, new() 
    { 
     if (!_singletons.Contains(typeof(V))) 
     { 
      _singletons.Add(new V()); 
     } 
     return (V)_singletons[typeof(V)]; 
    } 
} 

Việc sử dụng các nhà máy đơn giản này sẽ là một cái gì đó như sau:

[Test] 
    public void Returns_Singletons() 
    { 
     Factory<ICar> factory = new Factory<ICar>(); 
     Opel opel1 = factory.GetSingleton<Opel>(); 
     Opel opel2 = factory.GetSingleton<Opel>(); 

     Assert.IsNotNull(opel1); 
     Assert.IsNotNull(opel2); 
     Assert.AreEqual(opel1, opel2); 
    } 

Một cách sử dụng khác cho KeyedByTypeCollection<T> sẽ nằm trong một bộ định vị dịch vụ ...

+1

Cảm ơn, vì mục đích sử dụng tốt mà bạn đã cung cấp tại đây. – Biswanath

+0

Tại sao một nhà máy muốn trả lại đơn? –

3

"Nhà máy singleton" là một cách tiếp cận khác nhau với probl em của những người độc thân.

Có ba phương pháp chính:

  1. Thực hiện một Current hoặc Instance tài sản trong mỗi lớp - có nghĩa là rất nhiều mã lặp đi lặp lại. Điều đó thật tệ.

  2. Triển khai lớp cơ sở Singleton<T> - có nghĩa là bạn có thể có class A : Singleton<B> rõ ràng là sai.

  3. Triển khai SingletonFactory - đây là tài liệu được nêu rõ. Tôi đã nghĩ nó khoảng 12 tháng trước và thật sự ngạc nhiên khi thấy nó là một chủ đề được đề cập rất tốt trong thế giới Java. Một trong những tôi đã viết cho khách hàng hiện tại của tôi không có hạn chế giao diện, và là tĩnh, có nghĩa là nó có một khóa xung quanh bộ sưu tập cho an toàn thread. Nếu không làm cho nó tĩnh, bạn có nguy cơ nhận được hai singletons cùng loại mà là các đối tượng khác nhau.

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