Tôi không phải là chuyên gia, nhưng tôi nghĩ tôi có thể giúp. Và vâng, đó là một loại tiêm phụ thuộc cụ thể.
Tuyên bố miễn trừ trách nhiệm: Hầu như tất cả những thứ này đã bị "đánh cắp" từ Ninject Wiki
Hãy xem xét ý tưởng tiêm phụ thuộc bằng cách xem qua một ví dụ đơn giản. Giả sử bạn đang viết trò chơi bom tấn tiếp theo, nơi các chiến binh cao quý chiến đấu vì vinh quang vĩ đại. Đầu tiên, chúng ta sẽ cần một vũ khí phù hợp để trang bị cho các chiến binh của chúng ta.
class Sword
{
public void Hit(string target)
{
Console.WriteLine("Chopped {0} clean in half", target);
}
}
Sau đó, hãy tạo một lớp để đại diện cho chính các chiến binh của chúng ta. Để tấn công kẻ thù của nó, chiến binh sẽ cần một phương thức Attack (). Khi phương thức này được gọi, nó nên sử dụng Kiếm của mình để tấn công đối thủ.
class Samurai
{
readonly Sword sword;
public Samurai()
{
this.sword = new Sword();
}
public void Attack(string target)
{
this.sword.Hit(target);
}
}
Bây giờ, chúng ta có thể tạo Samurai của mình và chiến đấu!
class Program
{
public static void Main()
{
var warrior = new Samurai();
warrior.Attack("the evildoers");
}
}
Như bạn có thể tưởng tượng, điều này sẽ in Chặt những kẻ bất lương làm sạch một nửa ra bàn điều khiển. Điều này hoạt động tốt, nhưng nếu chúng ta muốn trang bị Samurai của mình bằng vũ khí khác thì sao? Vì Thanh kiếm được tạo ra bên trong nhà xây dựng của lớp Samurai, chúng tôi phải sửa đổi việc triển khai lớp để thực hiện thay đổi này.
Khi một lớp phụ thuộc vào một phụ thuộc cụ thể, nó được cho là được liên kết chặt chẽ với lớp đó . Trong ví dụ này, lớp Samurai được liên kết chặt chẽ với lớp Kiếm. Khi các lớp được liên kết chặt chẽ, chúng không thể thay thế cho nhau mà không làm thay đổi việc thực hiện. Để tránh các lớp khớp nối chặt chẽ, chúng ta có thể sử dụng các giao diện để cung cấp một mức độ gián tiếp. Hãy tạo một giao diện để thể hiện vũ khí trong trò chơi của chúng tôi.
interface IWeapon
{
void Hit(string target);
}
Sau đó, lớp Sword của chúng tôi có thể thực hiện giao diện này:
class Sword : IWeapon
{
public void Hit(string target)
{
Console.WriteLine("Chopped {0} clean in half", target);
}
}
Và chúng ta có thể thay đổi lớp Samurai của mình:
class Samurai
{
readonly IWeapon weapon;
public Samurai()
{
this.weapon = new Sword();
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}
Bây giờ Samurai của chúng tôi có thể được trang bị vũ khí khác nhau. Nhưng chờ đã! Thanh kiếm vẫn được tạo ra bên trong nhà xây dựng của Samurai. Vì chúng tôi vẫn cần thay đổi việc triển khai Samurai để cung cấp cho chiến binh của chúng tôi một vũ khí khác, Samurai vẫn gắn bó chặt chẽ với Kiếm.
May mắn thay, có một giải pháp dễ dàng. Thay vì tạo ra Thanh kiếm từ bên trong nhà xây dựng của Samurai, chúng ta có thể trưng ra nó như một tham số của nhà xây dựng. Còn được gọi là tiêm xây dựng.
class Samurai
{
readonly IWeapon weapon;
public Samurai(IWeapon weapon)
{
this.weapon = weapon;
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}
Như Giorgio đã chỉ ra, cũng có tiêm tài sản. Đó sẽ là một cái gì đó như:
class Samurai
{
IWeapon weapon;
public Samurai() { }
public void SetWeapon(IWeapon weapon)
{
this.weapon = weapon;
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}
Hi vọng điêu nay co ich.