ฉันไม่มีความเชี่ยวชาญ แต่ฉันคิดว่าฉันสามารถช่วยได้ และใช่มันเป็นประเภทเฉพาะของการพึ่งพาการฉีด
คำเตือน: เกือบทั้งหมดนี้เป็น "ขโมย" จากNinject Wiki
ลองตรวจสอบแนวคิดของการฉีดพึ่งพาโดยการเดินผ่านตัวอย่างง่ายๆ สมมติว่าคุณกำลังเขียนเกมบล็อกบัสเตอร์ต่อไปที่ซึ่งเหล่าขุนนางชั้นสูงต่อสู้เพื่อความรุ่งโรจน์ อันดับแรกเราจะต้องมีอาวุธที่เหมาะสมสำหรับการเตรียมนักรบของเรา
class Sword
{
public void Hit(string target)
{
Console.WriteLine("Chopped {0} clean in half", target);
}
}
จากนั้นให้สร้างคลาสเพื่อเป็นตัวแทนนักรบของเรา เพื่อที่จะโจมตีศัตรูนักรบจะต้องใช้วิธีการโจมตี () เมื่อมีการเรียกวิธีนี้มันควรใช้ Sword เพื่อโจมตีคู่ต่อสู้
class Samurai
{
readonly Sword sword;
public Samurai()
{
this.sword = new Sword();
}
public void Attack(string target)
{
this.sword.Hit(target);
}
}
ตอนนี้เราสามารถสร้างซามูไรของเราและต่อสู้!
class Program
{
public static void Main()
{
var warrior = new Samurai();
warrior.Attack("the evildoers");
}
}
อย่างที่คุณอาจจินตนาการว่าสิ่งนี้จะพิมพ์Chopped ทำความชั่วในครึ่งไปยังคอนโซล มันใช้งานได้ดี แต่ถ้าเราต้องการที่จะติดอาวุธซามูไรกับอาวุธอื่นล่ะ? เนื่องจากดาบถูกสร้างขึ้นภายในคอนสตรัคเตอร์ของซามูไรเราต้องแก้ไขการใช้งานคลาสเพื่อทำการเปลี่ยนแปลงนี้
เมื่อชั้นเรียนขึ้นอยู่กับการพึ่งพาที่เป็นรูปธรรมจะมีการกล่าวถึงการเชื่อมโยงอย่างแน่นหนากับชั้นเรียนนั้น ในตัวอย่างนี้คลาสซามูไรอยู่คู่กับคลาส Sword อย่างแน่นหนา เมื่อชั้นเรียนมีการเชื่อมโยงอย่างแน่นหนาพวกเขาจะไม่สามารถแลกเปลี่ยนได้ เพื่อหลีกเลี่ยงการมีเพศสัมพันธ์อย่างแน่นหนาเราสามารถใช้อินเทอร์เฟซเพื่อกำหนดระดับของการอ้อม มาสร้างส่วนต่อประสานเพื่อเป็นตัวแทนอาวุธในเกมของเรา
interface IWeapon
{
void Hit(string target);
}
จากนั้นคลาส Sword ของเราสามารถใช้ส่วนต่อประสานนี้:
class Sword : IWeapon
{
public void Hit(string target)
{
Console.WriteLine("Chopped {0} clean in half", target);
}
}
และเราสามารถเปลี่ยนชั้นซามูไรของเรา:
class Samurai
{
readonly IWeapon weapon;
public Samurai()
{
this.weapon = new Sword();
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}
ตอนนี้ซามูไรของเราสามารถติดอาวุธด้วยอาวุธที่แตกต่างกัน แต่เดี๋ยวก่อน! ดาบยังคงถูกสร้างขึ้นภายในตัวสร้างของซามูไร เนื่องจากเรายังคงต้องเปลี่ยนการใช้งานของซามูไรเพื่อให้อาวุธของเรานักรบอีกซามูไรยังคงเป็นคู่กับ Sword อย่างแน่นหนา
โชคดีที่มีทางออกที่ง่าย แทนที่จะสร้างดาบจากภายในตัวสร้างของซามูไรเราสามารถเปิดเผยมันเป็นพารามิเตอร์ของตัวสร้างแทน หรือที่เรียกว่า Constructor Injection
class Samurai
{
readonly IWeapon weapon;
public Samurai(IWeapon weapon)
{
this.weapon = weapon;
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}
ขณะที่จอร์โจชี้ให้เห็นยังมีการฉีดคุณสมบัติ นั่นจะเป็นสิ่งที่ชอบ:
class Samurai
{
IWeapon weapon;
public Samurai() { }
public void SetWeapon(IWeapon weapon)
{
this.weapon = weapon;
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}
หวังว่านี่จะช่วยได้