การสร้าง Unity Container ควรถือเป็นการดำเนินการที่มีราคาแพงหรือไม่ เนื่องจากเกี่ยวข้องกับทรัพยากรและเวลา

ฉันเพิ่งเริ่มใช้ Unity สำหรับการฉีดการพึ่งพาใน .net ฉันรู้สึกว่า Unity Container น่าจะเป็นสมาชิกแบบซิงเกิลตันหรือแบบคงที่ของคลาส ฉันเห็นนักพัฒนารายอื่นใช้มันในตัวจัดการคำขอที่จะได้รับปริมาณข้อมูลจำนวนมาก

มีเวทย์มนตร์เกิดขึ้นบ้างไหมที่ทำให้ต้นทุนต่ำในการสร้าง Unity Container ใหม่ทุกครั้ง หรือโค้ดนี้ควรได้รับการปรับโครงสร้างใหม่เพื่อสร้าง Unity Container เพียงครั้งเดียวหรือไม่

รหัสนี้เป็นส่วนหนึ่งของคลาสการใช้งานของบริการ .svc

public string DoSomeWork(Request request)
{
   var container = new UnityContainer().LoadConfiguration("MyContainer");
   var handler = container.Resolve<RequestHandler>();
   return handler.Handle(request);
}

person ScArcher2    schedule 14.09.2011    source แหล่งที่มา
comment
โดยปกติแล้วคุณจะสร้างคอนเทนเนอร์ DI ที่รูทองค์ประกอบของคุณ ไม่ใช่เพราะมันมีราคาแพง แต่เพียงเพราะมันสมเหตุสมผลในรูปแบบ DI ที่ยิ่งใหญ่ การทำการเชื่อมโยงภายนอกรูทองค์ประกอบมักจะทำให้การออกแบบแย่ลง   -  person Andrew Savinykh    schedule 15.09.2011
comment
ฉันควรจะชี้แจงให้ชัดเจนว่ารหัสนี้ใช้เพื่อใช้บริการ (ไฟล์ .svc) ฉันไม่รู้ว่า Unity สามารถใช้เป็นส่วนหนึ่งของ .svc ได้โดยตรง   -  person ScArcher2    schedule 15.09.2011


คำตอบ (2)


ไม่มั่นใจ 100% สำหรับ Unity แต่สำหรับคอนเทนเนอร์ IoC ส่วนใหญ่ การสร้างคอนเทนเนอร์และโดยเฉพาะอย่างยิ่งการโหลดการกำหนดค่าคอนเทนเนอร์นั้นเป็นการดำเนินการที่มีราคาแพงพอสมควร

ฉันต้องตั้งคำถามว่าทำไมนักพัฒนารายนี้ถึงใช้คอนเทนเนอร์ในลักษณะนี้ ตามหลักการแล้ว คอนเทนเนอร์ IoC ไม่ควรเป็นวัตถุแบบคงที่หรือแบบซิงเกิลตันด้วยซ้ำ - ควรสร้างอินสแตนซ์เพื่อแก้ไขออบเจ็กต์ระดับบนสุดของแผนผังการขึ้นต่อกันของคุณเท่านั้น และออบเจ็กต์ที่เหลือในแอปพลิเคชันของคุณควรถูกสร้างขึ้นโดยอัตโนมัติผ่านการฉีดการขึ้นต่อกัน ในกรณีตัวอย่างของคุณ คลาสที่มีเมธอดนั้นโดยหลักการแล้วจะต้องมี RequestHandler (อินเทอร์เฟซของสิ่งนี้) แทรกเข้าไปในคลาสนั้นผ่าน Constructor เพื่อให้คลาสนั้นไม่จำเป็นต้องรู้เกี่ยวกับคอนเทนเนอร์ IoC

person Paul Kirby    schedule 14.09.2011
comment
ฉันควรจะชี้แจงให้ชัดเจนว่ารหัสนี้ใช้เพื่อใช้บริการ (ไฟล์ .svc) ฉันไม่รู้ว่า Unity สามารถใช้เป็นส่วนหนึ่งของ .svc ได้โดยตรง - person ScArcher2; 15.09.2011

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

สิ่งที่คุณควรทำคือมีจุดศูนย์กลางเพียงจุดเดียวในโค้ดเบสของคุณ ซึ่งการขึ้นต่อกันทั้งหมดได้รับการแก้ไขแล้ว จากนั้นใช้การขึ้นต่อกันของการฉีด (DI) เพื่อเผยแพร่คลาสคอนกรีตที่ได้รับการแก้ไขลงในห่วงโซ่ เช่น ผ่านการฉีดคอนสตรัคเตอร์ ดังนั้นชั้นเรียนของคุณควรมีลักษณะเช่นนี้:

public class Foo
{
    private readonly IRequestHandler _handler;

    public Foo(IRequestHandler handler)
    {
        _handler = handler;
    }

    public string DoSomeWork(Request request)
    {
        return _handler.Handle(request);
    }
}
person BrokenGlass    schedule 14.09.2011
comment
ฉันควรจะชี้แจงให้ชัดเจนว่ารหัสนี้ใช้เพื่อใช้บริการ (ไฟล์ .svc) ฉันไม่รู้ว่า Unity สามารถใช้เป็นส่วนหนึ่งของ .svc ได้โดยตรง - person ScArcher2; 15.09.2011