2008-11-10 28 views
10

Nói chung, tôi muốn giữ cho một ứng dụng hoàn toàn không biết gì về thùng chứa IoC. Tuy nhiên tôi đã gặp phải những vấn đề mà tôi cần truy cập vào nó. Để trừu tượng đi nỗi đau tôi sử dụng Singleton cơ bản. Trước khi bạn chạy cho những ngọn đồi hoặc kéo ra shotgun, hãy để tôi đi qua giải pháp của tôi. Về cơ bản, các singleton IoC không absolutly gì, nó chỉ đơn giản là đại biểu cho một giao diện nội bộ mà phải được thông qua in Tôi đã tìm thấy điều này làm cho làm việc với Singleton ít đau đớn.Tóm tắt IoC Container Đằng sau một Singleton - Làm sai?

Dưới đây là wrapper IoC:

public static class IoC 
    { 
     private static IDependencyResolver inner; 

     public static void InitWith(IDependencyResolver container) 
     { 
      inner = container; 
     } 

     /// <exception cref="InvalidOperationException">Container has not been initialized. Please supply an instance if IWindsorContainer.</exception> 
     public static T Resolve<T>() 
     { 
      if (inner == null) 
       throw new InvalidOperationException("Container has not been initialized. Please supply an instance if IWindsorContainer."); 

      return inner.Resolve<T>(); 
     } 

     public static T[] ResolveAll<T>() 
     { 
      return inner.ResolveAll<T>(); 
     } 
    } 

IDependencyResolver:

public interface IDependencyResolver 
    { 
     T Resolve<T>(); 
     T[] ResolveAll<T>(); 
    } 

tôi đã thành công rực rỡ cho đến nay với vài lần tôi đã sử dụng nó (có thể một lần mỗi vài dự án, Tôi thực sự không muốn sử dụng điều này chút nào) vì tôi có thể tiêm bất cứ thứ gì tôi muốn: Lâu đài, một Stub, hàng giả, v.v.

Đây có phải là con đường trơn không? Tôi sẽ chạy vào các vấn đề tiềm năng xuống đường?

Trả lời

4

Tôi đã thấy rằng ngay cả Ayende cũng thực hiện mẫu này trong mã Rhino Commons, nhưng tôi khuyên bạn nên sử dụng nó bất cứ khi nào có thể. Có một lý do Castle Windsor không có mã này theo mặc định. StructureMap có, nhưng Jeremy Miller đã rời khỏi nó. Lý tưởng nhất, bạn nên quan tâm đến các container chính nó với nhiều nghi ngờ như bất kỳ biến toàn cầu.

Tuy nhiên, thay vào đó, bạn luôn có thể định cấu hình vùng chứa của mình để giải quyết IDependencyResolver làm tham chiếu đến vùng chứa của bạn. Điều này nghe có vẻ điên rồ, nhưng nó linh hoạt hơn nhiều. Chỉ cần nhớ quy tắc của một ngón tay cái mà một đối tượng nên gọi là "mới" hoặc thực hiện xử lý, nhưng không phải cả hai. Đối với "cuộc gọi mới", hãy thay thế bằng "giải quyết tham chiếu".

3

Đó thực sự không phải là một lớp singleton. Đó là một lớp tĩnh với các thành viên tĩnh. Và có vẻ như đó là một cách tiếp cận tốt.

Tôi nghĩ JP Boodhoo thậm chí còn có tên cho mẫu này. The Static Gateway pattern.

2

Chỉ cần lưu ý: Các mẫu và thực tiễn của Microsoft đã tạo một bộ định vị dịch vụ chung (http://www.codeplex.com/CommonServiceLocator) rằng hầu hết các thùng chứa IoC chính sẽ được triển khai trong tương lai gần. Bạn có thể bắt đầu sử dụng nó thay vì IDependencyResolver của bạn.

BTW: đây là cách phổ biến để giải quyết vấn đề của bạn và nó hoạt động khá tốt.

1

Tất cả phụ thuộc vào cách sử dụng. Sử dụng vùng chứa như vậy được gọi là Mẫu định vị dịch vụ. Có những trường hợp không phù hợp và trường hợp áp dụng.

Nếu bạn google "mẫu trình định vị dịch vụ", bạn sẽ thấy rất nhiều bài đăng trên blog cho biết rằng đó là một mẫu chống giả mạo. Các mô hình chỉ đơn giản là bị lạm dụng (/ lạm dụng).

Đối với dòng ứng dụng doanh nghiệp điển hình, bạn không nên sử dụng SL khi bạn ẩn phụ thuộc. Bạn cũng có một vấn đề khác: Bạn không thể quản lý trạng thái/đời nếu bạn sử dụng vùng chứa gốc (thay vì một trong những thời gian tồn tại của nó).

Trình định vị dịch vụ phù hợp khi nói đến cơ sở hạ tầng. Ví dụ ASP.NET MVC sử dụng Service Locator để có thể giải quyết tất cả các phụ thuộc cho mỗi bộ điều khiển.

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