Cả hai mẫu có vẻ giống như việc thực hiện nguyên tắc đảo ngược kiểm soát. Đó là, một đối tượng không nên biết cách xây dựng các phụ thuộc của nó.Sự khác nhau giữa các mẫu Dependency Injection và Service Locator là gì?
Tiêm phụ thuộc (DI) có vẻ như sử dụng một hàm tạo hoặc setter để "tiêm" phụ thuộc của nó.
Ví dụ về sử dụng Constructor Injection:
//Foo Needs an IBar
public class Foo
{
private IBar bar;
public Foo(IBar bar)
{
this.bar = bar;
}
//...
}
Service Locator dường như sử dụng một "container", mà dây lên phụ thuộc của nó và cung cấp cho foo bar của nó.
Ví dụ về cách sử dụng một Locator Service:
//Foo Needs an IBar
public class Foo
{
private IBar bar;
public Foo()
{
this.bar = Container.Get<IBar>();
}
//...
}
Bởi vì phụ thuộc của chúng tôi chỉ là các đối tượng chính họ, những phụ thuộc có phụ thuộc, trong đó có nhiều hơn phụ thuộc, và vân vân và vân vân. Do đó, Inversion of Control Container (hoặc DI Container) được sinh ra. Ví dụ: Lâu đài Windsor, Ninject, Bản đồ Cấu trúc, Mùa xuân, v.v ...
Nhưng Hộp chứa IOC/DI trông giống chính xác như một Dịch vụ Định vị. Có gọi nó là DI Container không? Là một IOC/DI Container chỉ khác loại của Dịch vụ định vị? Sắc thái trong thực tế là chúng ta sử dụng DI Containers chủ yếu là khi chúng ta có nhiều Dependencies?
Đảo ngược kiểm soát có nghĩa là "một đối tượng không nên biết cách xây dựng các phụ thuộc của nó"?!? Cái đó mới mẻ với tôi. Không, thực sự, đó không phải là những gì "đảo ngược kiểm soát" có nghĩa là. Xem http://martinfowler.com/bliki/InversionOfControl.html Bài viết đó thậm chí còn cung cấp các tham chiếu cho từ nguyên của thuật ngữ, có niên đại từ những năm 1980. –
Trả lời tại đây: http://www.infoq.com/articles/Succeeding-Dependency-Injection –
Mark Seemann lập luận Service Locator là anti-pattern (http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti- Mẫu/). Ngoài ra, tôi tìm thấy sơ đồ (tìm thấy ở đây, http://stackoverflow.com/a/9503612/1977871) hữu ích để hiểu tình trạng khó khăn DI và SL. Hi vọng điêu nay co ich. – VivekDev