สมมติว่าฉันมีสิ่งService
ที่ได้รับการอ้างอิงผ่านตัวสร้าง แต่ยังต้องเริ่มต้นด้วยข้อมูลที่กำหนดเอง (บริบท) ก่อนจึงจะสามารถใช้:
public interface IService
{
void Initialize(Context context);
void DoSomething();
void DoOtherThing();
}
public class Service : IService
{
private readonly object dependency1;
private readonly object dependency2;
private readonly object dependency3;
public Service(
object dependency1,
object dependency2,
object dependency3)
{
this.dependency1 = dependency1 ?? throw new ArgumentNullException(nameof(dependency1));
this.dependency2 = dependency2 ?? throw new ArgumentNullException(nameof(dependency2));
this.dependency3 = dependency3 ?? throw new ArgumentNullException(nameof(dependency3));
}
public void Initialize(Context context)
{
// Initialize state based on context
// Heavy, long running operation
}
public void DoSomething()
{
// ...
}
public void DoOtherThing()
{
// ...
}
}
public class Context
{
public int Value1;
public string Value2;
public string Value3;
}
ตอนนี้ - ข้อมูลบริบทไม่ทราบล่วงหน้าดังนั้นฉันไม่สามารถลงทะเบียนเป็นการพึ่งพาและใช้ DI เพื่อฉีดเข้าไปในบริการ
นี่คือลักษณะลูกค้าตัวอย่าง:
public class Client
{
private readonly IService service;
public Client(IService service)
{
this.service = service ?? throw new ArgumentNullException(nameof(service));
}
public void OnStartup()
{
service.Initialize(new Context
{
Value1 = 123,
Value2 = "my data",
Value3 = "abcd"
});
}
public void Execute()
{
service.DoSomething();
service.DoOtherThing();
}
}
อย่างที่คุณเห็น - มีการมีเพศสัมพันธ์ชั่วคราวและกำหนดค่าเริ่มต้นให้มีกลิ่นรหัสที่เกี่ยวข้องเพราะก่อนอื่นฉันต้องโทรservice.Initialize
เพื่อให้สามารถโทรservice.DoSomething
และservice.DoOtherThing
หลังจากนั้น
อะไรคือแนวทางอื่นที่ฉันสามารถขจัดปัญหาเหล่านี้ได้?
การชี้แจงเพิ่มเติมเกี่ยวกับพฤติกรรม:
แต่ละอินสแตนซ์ของลูกค้าจำเป็นต้องมีอินสแตนซ์ของตัวเองของบริการเริ่มต้นด้วยข้อมูลบริบทเฉพาะของลูกค้า ดังนั้นข้อมูลบริบทนั้นไม่คงที่หรือทราบล่วงหน้าดังนั้นจึงไม่สามารถฉีดโดย DI ในตัวสร้าง