Supponiamo di avere quello Serviceche riceve dipendenze tramite il costruttore ma deve anche essere inizializzato con dati personalizzati (contesto) prima che possano essere utilizzati:
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;
}
Ora - i dati di contesto non sono noti in anticipo, quindi non posso registrarli come dipendenza e utilizzare DI per iniettarli nel servizio
Ecco come appare il client di esempio:
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();
}
}
Come puoi vedere, ci sono accoppiamenti temporali e inizializzazione di odori di codice di metodo coinvolti, perché ho prima bisogno di chiamare service.Initializeper poter chiamare service.DoSomethinge service.DoOtherThingpoi.
Quali sono gli altri approcci in cui posso eliminare questi problemi?
Ulteriori chiarimenti sul comportamento:
Ogni istanza del client deve avere la propria istanza del servizio inizializzata con i dati di contesto specifici del client. Pertanto, i dati di contesto non sono statici o noti in anticipo, quindi non possono essere iniettati da DI nel costruttore.