ฉันมีคลาสแกนกลางจำนวนมากที่ต้องการ ISessionContext ของฐานข้อมูล ILogManager สำหรับบันทึกและ IService ที่ใช้สำหรับสื่อสารกับบริการอื่น ฉันต้องการใช้การฉีดพึ่งพาสำหรับชั้นนี้ใช้โดยชั้นเรียนหลักทั้งหมด
ฉันใช้งานได้สองแบบ คลาสหลักที่ยอมรับ IAmbientContext กับคลาสทั้งหมดสามคลาสหรือฉีดสำหรับคลาสทั้งหมดสามคลาส
public interface ISessionContext
{
...
}
public class MySessionContext: ISessionContext
{
...
}
public interface ILogManager
{
}
public class MyLogManager: ILogManager
{
...
}
public interface IService
{
...
}
public class MyService: IService
{
...
}
วิธีแก้ปัญหาแรก:
public class AmbientContext
{
private ISessionContext sessionContext;
private ILogManager logManager;
private IService service;
public AmbientContext(ISessionContext sessionContext, ILogManager logManager, IService service)
{
this.sessionContext = sessionContext;
this.logManager = logManager;
this.service = service;
}
}
public class MyCoreClass(AmbientContext ambientContext)
{
...
}
วิธีที่สอง (ไม่มีบริบท)
public MyCoreClass(ISessionContext sessionContext, ILogManager logManager, IService service)
{
...
}
ในกรณีนี้คือทางออกที่ดีที่สุด?
IService
ใช้เพื่อสื่อสารกับบริการอื่น" คืออะไร หากIService
แสดงถึงการอ้างอิงที่คลุมเครือในบริการอื่น ๆ ดูเหมือนว่าตัวระบุบริการและไม่ควรมีอยู่ คลาสของคุณควรขึ้นอยู่กับอินเทอร์เฟซที่อธิบายอย่างชัดเจนว่าผู้บริโภคจะทำอะไรกับพวกเขา ไม่ต้องการคลาสเพื่อให้สามารถเข้าถึงบริการได้ คลาสต้องการการพึ่งพาที่ทำสิ่งที่เฉพาะเจาะจงที่คลาสต้องการ