Mức độ khác biệt giữa các câu trả lời ở đây cho thấy lý do tại sao nó sẽ là một khái niệm khó nắm bắt nhưng để đặt nó đơn giản như tôi có thể mô tả nó:
Để tôi biết rằng nếu tôi ném bóng cho bạn, thì bạn có thể bắt nó tôi thực sự không cần biết bạn bao nhiêu tuổi. Tôi không cần biết bạn đã ăn gì vào bữa sáng, và tôi thực sự không quan tâm ai là người đầu tiên của bạn. Tất cả tôi cần biết là bạn có thể bắt. Nếu tôi biết điều này, thì tôi không quan tâm nếu đó là bạn, tôi đang ném bóng cho bạn hoặc anh trai của bạn.
Với các ngôn ngữ không động như c # hoặc Java, v.v., chúng tôi thực hiện việc này thông qua Giao diện. Vì vậy, hãy nói rằng chúng ta có giao diện sau:
public ICatcher
{
public void Catch();
}
Và bây giờ hãy nói rằng chúng ta có các lớp sau:
public CatcherA : ICatcher
{
public void Catch()
{
console.writeline("You Caught it");
}
}
public CatcherB : ICatcher
{
public void Catch()
{
console.writeline("Your brother Caught it");
}
}
Bây giờ, cả CatchA và CatchB đều thực hiện phương thức Catch, do đó, dịch vụ yêu cầu một Catch có thể sử dụng một trong hai phương thức này và không thực sự đưa ra một cái chết tiệt nào. Vì vậy, một dịch vụ kết hợp chặt chẽ có thể trực tiếp kích hoạt một sản phẩm bị bắt
public CatchService
{
private CatcherA catcher = new CatcherA();
public void CatchService()
{
catcher.Catch();
}
}
Vì vậy, CatchService có thể thực hiện chính xác những gì nó đã đặt ra, nhưng nó sử dụng CatchA và sẽ luôn sử dụng CatchA. Nó cứng mã hóa, vì vậy nó ở đó cho đến khi có người đi cùng và tái cấu trúc nó.
Bây giờ hãy thực hiện một tùy chọn khác, được gọi là tiêm phụ thuộc:
public CatchService
{
private ICatcher catcher;
public void CatchService(ICatcher catcher)
{
this.catcher = catcher;
catcher.Catch();
}
}
Vì vậy, các calss khởi tạo CatchService có thể làm như sau:
CatchService catchService = new CatchService(new CatcherA());
hoặc là
CatchService catchService = new CatchService(new CatcherB());
Điều này có nghĩa là dịch vụ Catch không được kết hợp chặt chẽ với CatchA hoặc CatchB.
Có một số chiến lược khác cho các dịch vụ ghép lỏng lẻo như thế này, chẳng hạn như việc sử dụng khung IoC, v.v.