Ho le seguenti due classi:
public class StoreService : IStoreService
{
private IEmailService _emailService;
public StoreService(IEmailService emailService)
{
_emailService = emailService;
}
}
public class EmailService : IEmailService
{
}
Usando Ninject I puoi impostare i binding senza problemi per farlo iniettare un'implementazione concreta di IEmailService nel costruttore StoreService. StoreService viene effettivamente inserito nel codice sottostante di un WebForm ASP.NET in questo modo:
[Ninject.Inject]
public IStoreService StoreService { get; set; }
Ma ora ho bisogno di cambiare EmailService per accettare un oggetto che contiene le impostazioni relative a SMTP (che vengono estratte da ApplicationSettings di Web.config). Così ho cambiato EmailService ora come questo:
public class EmailService : IEmailService
{
private SMTPSettings _smtpSettings;
public void SetSMTPSettings(SMTPSettings smtpSettings)
{
_smtpSettings = smtpSettings;
}
}
L'impostazione di SMTPSettings in questo modo richiede anche che venga passata in StoreService (tramite un altro metodo pubblico). Questo deve essere fatto nel metodo Page_Load nel codice WebForms (ho solo accesso alla classe Settings nel livello UI).
Con DI manuale / povero potrei passare SMTPSettings direttamente nel costruttore di EmailService e quindi inserire EmailService nel costruttore di StoreService. Con Ninject I non ho accesso alle istanze di tipi iniettati al di fuori degli oggetti a cui sono iniettati, quindi devo impostare i loro dati AFTER Ninject li ha già iniettati tramite un metodo di setter pubblico separato. Questo a me sembra sbagliato.
Come dovrei davvero risolvere questo scenario?