การทำงานกับ Unity Application Block

เช่นเดียวกับ Castle Windsor และ StructureMap Unity Application Block ยังเป็นคอนเทนเนอร์ IoC (Inversion of Control) Unity Application Block จาก Microsoft เป็นคอนเทนเนอร์ฉีดขึ้นรูปที่ขยายได้น้ำหนักเบา ให้การสนับสนุนสำหรับ constructor injection, property injection และ method call injection อนึ่ง Unity Application Block ถูกนำมาใช้เป็นส่วนหนึ่งของ Enterprise Library

ในกรณีที่คุณไม่คุ้นเคยกับสิ่งที่ Dependency Injection และ Inversion of Control เป็นข้อมูลเกี่ยวกับนี่คือคำอธิบายโดยย่อ Dependency Injection เป็นการทำให้หลักการ IoC เป็นจริง ทั้งการควบคุมแบบผกผันและการฉีดแบบพึ่งพาเป็นวิธีที่ช่วยให้คุณสามารถทำลายการอ้างอิงระหว่างส่วนประกอบในแอปพลิเคชันของคุณ หลักการของ Dependency Injection ระบุว่าโมดูลระดับสูงในแอปพลิเคชันไม่ควรขึ้นอยู่กับโมดูลระดับต่ำ แต่ทั้งสองควรขึ้นอยู่กับนามธรรม

เป้าหมายการออกแบบ Unity Application Block

Unity Application Block คือคอนเทนเนอร์ Dependency Injection (DI) โปรดทราบว่า Unity Application Block ไม่มีการพึ่งพาระบบการกำหนดค่าไลบรารีขององค์กร ดังนั้นคุณสามารถใช้เป็นคอนเทนเนอร์ฉีดพึ่งพาแบบสแตนด์อะโลนได้โดยไม่ต้องติดตั้งไลบรารีขององค์กรในระบบของคุณ เป้าหมายการออกแบบของ Unity Application Block มีดังต่อไปนี้:

  1. ส่งเสริมการออกแบบโมดูลาร์ผ่านการแยกชิ้นส่วน
  2. จัดหาภาชนะฉีดขึ้นรูปได้อย่างรวดเร็วขยายได้และน้ำหนักเบา
  3. ให้การสนับสนุนสำหรับการขยายผ่านส่วนขยาย
  4. ให้การสนับสนุนสำหรับการฉีดแอตทริบิวต์ที่ขับเคลื่อนด้วย
  5. ให้การสนับสนุนสำหรับ API ที่ใช้งานง่ายในการเชื่อมต่อและทำงานกับคอนเทนเนอร์การฉีดแบบพึ่งพา

เริ่มต้นใช้งาน

ในส่วนนี้เราจะสำรวจวิธีเริ่มต้นใช้งาน Unity Application Block ในแอปพลิเคชันของเรา ขั้นตอนแรกควรติดตั้ง Unity Application Block ในระบบของคุณ วิธีที่ง่ายที่สุดในการติดตั้งไลบรารีนี้คือผ่าน NuGet สำหรับวัตถุประสงค์ของภาพประกอบนี้เราจะใช้โครงการแอปพลิเคชันคอนโซลที่นี่ ในการสร้างแอปพลิเคชันแรกโดยใช้ Unity Application Block ให้ทำตามขั้นตอนเหล่านี้:

  1. เปิด Visual Studio IDE
  2. สร้างโครงการคอนโซลและบันทึกด้วยชื่อ
  3. คลิกขวาที่โครงการในหน้าต่าง Solution Explorer
  4. เลือก "จัดการแพ็คเกจ NuGet ... "
  5. ติดตั้ง Unity NuGet Package Manager

นั่นคือทั้งหมดที่คุณต้องทำเพื่อจัดเวทีให้คุณเริ่มใช้ Unity ตอนนี้คุณพร้อมที่จะใช้ Unity Application Block ในโปรเจ็กต์ของคุณแล้ว

การสร้างและแก้ไขการอ้างอิงวัตถุโดยใช้ Unity container

คุณสามารถใช้ Unity container เพื่อแก้ไขการอ้างอิงกับออบเจ็กต์หนึ่ง ๆ ได้อย่างง่ายดายดังที่แสดงในข้อมูลโค้ดที่ตามมา

IUnityContainer container = new UnityContainer();

container.RegisterType();

container.RegisterType();

เมื่อคุณลงทะเบียนประเภทของวัตถุด้วย Unity container คุณสามารถระบุอายุการใช้งานได้ หากคุณไม่ระบุใด ๆ ระบบจะใช้อายุการใช้งานเริ่มต้น ผู้จัดการตลอดอายุการใช้งานควบคุมอายุการใช้งานของวัตถุที่ลงทะเบียน ประเภทของตัวจัดการอายุการใช้งานที่สนับสนุนโดย Unity Application Block ได้แก่ : TransientLifetimeManager, ContainerControlledLifetimeManager, HierarchicalLifetimeManager, PerThreadLifetimeManager และ ExternallyControlledLifetimeManager

พิจารณาอินเทอร์เฟซต่อไปนี้ที่เรียกว่า ILogger

public interface ILogger

   {

       string GetLogTypeName();

   }

อินเทอร์เฟซ ILogger มีการประกาศของวิธีการหนึ่งที่ชื่อ GetLogTypeName () คลาส FileLoger, DatabaseLogger และ EventLogger (ระบุด้านล่าง) ใช้อินเทอร์เฟซ ILogger

public class FileLogger : ILogger

   {

       public string GetLogTypeName()

       {

           return "File Logger";

       }

   }

   public class DatabaseLogger: ILogger

   {

       public string GetLogTypeName()

       {

           return "Database Logger";

       }

   }

   public class EventLogger: ILogger

   {

       public string GetLogTypeName()

       {

           return "Event Logger";

       }

   }

รายการรหัสต่อไปนี้แสดงวิธีการแก้ไขการอ้างอิงโดยใช้ UnityContainer

static void Main(string[] args)

{

IUnityContainer container = new UnityContainer();

container.RegisterType();

ILogger iLogger = container.Resolve();

string logType = iLogger.GetLogTypeName();

Console.WriteLine(logType);

Console.Read();

}

โปรดทราบว่า "คอนเทนเนอร์" ใน Unity Application Block คืออ็อบเจ็กต์ที่สามารถใช้เพื่อสร้างและแทรกการอ้างอิง คุณสามารถลงทะเบียนประเภทหรือประเภทการแมปกับ Unity container โดยใช้เมธอด RegisterType เมธอด Resolve () ใช้เพื่อส่งคืนอินสแตนซ์คอนกรีตของชนิดที่ลงทะเบียนสำหรับประเภททั่วไปที่กล่าวถึงโดยใช้ T. ในตัวอย่างโค้ดที่ระบุข้างต้นเมธอด Resolve () จะส่งคืนอินสแตนซ์ของคลาส FileLogger

วิธีอื่นในการระบุการรวม Unity คือการกำหนดค่า สมมติว่าคุณได้ระบุคอนเทนเนอร์ชื่อคอนเทนเนอร์ในการกำหนดค่า Unity ของคุณข้อมูลโค้ดต่อไปนี้แสดงให้เห็นว่าคุณสามารถเรียกใช้เมธอด LoadConfiguration บนอินสแตนซ์คอนเทนเนอร์ในโค้ดของคุณได้อย่างไร

string containerName = "Container";

IUnityContainer container = new UnityContainer().LoadConfiguration(containerName);