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에 의해 주입 될 수 없습니다.