ใช้บริการในคลาส MVC ด้วย Unity Ioc

ฉันมีแอปพลิเคชัน MVC ใช้ Unity Ioc

ประกาศและเริ่มบริการ:

public static void Initialize()
{
    IUnityContainer container = BuildUnityContainer();
    DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
private static IUnityContainer BuildUnityContainer()
{
    IUnityContainer container = new UnityContainer();
    container.RegisterType<ImyService, myService>(new HttpContextLifetimeManager<ImyService>());;
    return container;
}

ในชั้นเรียนฉันใช้รหัสดังต่อไปนี้:

var service = DependencyResolver.Current.GetService<ImyService>();

นี่คือไฟล์ UnityControllerFactory.cs

public override object GetValue()
{
    var assemblyQualifiedName = typeof(T).AssemblyQualifiedName;
    if (assemblyQualifiedName != null)
        return HttpContext.Current.Items[assemblyQualifiedName];
    return null;
}

เมื่อฉันเรียกใช้แอปพลิเคชัน มันส่งคืนข้อผิดพลาดที่: HttpContext.Current.Items[assemblyQualifiedName];

ข้อผิดพลาด:

ข้อมูลเพิ่มเติม: การอ้างอิงวัตถุไม่ได้ตั้งค่าเป็นอินสแตนซ์ของวัตถุ

ฉันจะใช้บริการในชั้นเรียนได้อย่างไร ขอบคุณ!


person M.Peter    schedule 17.08.2016    source แหล่งที่มา
comment
สิ่งเดียวกันนี้เกิดขึ้นหรือไม่หากคุณฉีดบริการเข้าไปในตัวสร้างคลาส?   -  person JB06    schedule 17.08.2016
comment
@ JB06 เมื่อฉันใช้ในคอนโทรลเลอร์ มันใช้งานได้และไม่มีข้อผิดพลาดใดๆ ใช้ในคลาสเท่านั้นมันจะผิดพลาดด้านบน   -  person M.Peter    schedule 17.08.2016


คำตอบ (1)


ปัญหาที่นี่คือ HTTPContext เป็นโมฆะเมื่อใช้จากคลาส (หรือไลบรารีคลาส) เช่นเดียวกับที่คุณพยายามทำ นั่นเป็นเพราะไม่มีการร้องขอให้ทำงานด้วย เมื่อคุณใช้มันจากคอนโทรลเลอร์ ทุกอย่างทำงานได้เพราะคอนโทรลเลอร์ถูกเรียกใช้เป็นส่วนหนึ่งของคำขอ ดังนั้นคุณจึงอยู่ในจุดนั้น

คุณสามารถอัปเดตคลาส UnityController Factory และส่งผ่านข้อมูล HTTPContext ที่จำเป็นเป็นพารามิเตอร์แทนได้ จากนั้นจึงใช้เมื่อจำเป็นได้ มันทำให้สิ่งต่าง ๆ ซับซ้อนเล็กน้อย

โปรดทราบว่าคุณไม่จำเป็นต้องผ่านวัตถุ HTTPContext ทั้งหมด เพียงแค่ผ่านขั้นต่ำที่คุณจะได้รับ

person Andrei Dragotoniu    schedule 17.08.2016
comment
ขอบคุณ @Andrei Dragotoniu ขออภัย ฉันไม่เข้าใจตัวแก้ไขของคุณ คุณสามารถให้บริการโค้ดตัวอย่างให้ฉันได้ - person M.Peter; 17.08.2016