2009-08-25 29 views
6

Những ưu điểm và nhược điểm của việc sử dụng Service Locator so với singleton là gì? Tôi đã đọc rằng các đơn là xấu nhưng tôi tự hỏi nếu s Service Locator nói chung là một cách tốt hơn để làm việc.Singleton Vs ServiceLocator

Trả lời

9

Cả hai cách tiếp cận đều xấu vì không rõ ràng từ hợp đồng lớp là 'phụ thuộc của nó. Đó là,

private void foo() 
{ 
    var x = SomeSingleton.Instance.GetX(); 
    var y = ServiceLocator.GetService<IProvider>().GetY(); 
} 

có tham chiếu đến SomeSingletonIProvider chôn sâu ở đâu đó bên trong.

Tuy nhiên, so với cách tiếp cận đơn thuần, định vị dịch vụ thường tốt hơn ở chỗ chúng cho phép cấu hình tập trung đơn giản hơn, quản lý lâu dài, v.v. Chúng cũng cho phép kiểm tra tốt hơn (bạn luôn có thể gọi đến GetService<T>) , tách mối quan tâm, v.v.

+2

Tôi sẽ đi xa đến mức xem xét cả hai mẫu chống nhưng tôi đồng ý rằng Công cụ định vị dịch vụ thuận lợi hơn một chút. Giải pháp tốt nhất là triển khai Dependency Injection. –

+0

từ những gì tôi hiểu từ DI, nó sẽ không yêu cầu tất cả các đối tượng được sử dụng để truy cập vào singleton trực tiếp để có một tham chiếu đến đối tượng exleton singleton? – djcouchycouch

+0

Có, bạn cần phải cung cấp cho chúng như là các tham số cho hàm tạo (nếu bạn sử dụng phép xây dựng, điều này thường được gọi là "Khai báo các phụ thuộc của bạn"). Để giảm bớt mọi thứ một chút, bạn có thể sử dụng hộp chứa Inversion of Control. Hãy xem Google Guice. –

0

nếu khả năng kiểm tra là một mối quan ngại, sử dụng trình định vị dịch vụ tốt hơn nhiều so với trình đơn thuần túy.