A questo punto sto iniettando cose nei miei controller con facilità, in alcuni casi creando la mia classe ResolverServices. La vita è buona.Iniezione dipendenza con classi diverse da una classe controller
Quello che non riesco a capire come fare è far sì che il framework si inietti automaticamente nelle classi non controller. Ciò che funziona è avere il quadro iniettare automaticamente nel mio controller IOptions
, che è effettivamente la configurazione per il mio progetto:
public class MessageCenterController : Controller
{
private readonly MyOptions _options;
public MessageCenterController(IOptions<MyOptions> options)
{
_options = options.Value;
}
}
Sono pensare che io possa avere lo stesso accada per le mie classi di un presumo che sono chiudere quando ho imitare il controllore, in questo modo:
public class MyHelper
{
private readonly ProfileOptions _options;
public MyHelper(IOptions<ProfileOptions> options)
{
_options = options.Value;
}
public bool CheckIt()
{
return _options.SomeBoolValue;
}
}
Penso dove sto in mancanza è quando lo chiamo così:
public void DoSomething()
{
var helper = new MyHelper(??????);
if (helper.CheckIt())
{
// Do Something
}
}
il proble m Ho rintracciato questo è praticamente tutto ciò che parla di DI sta parlando di esso a livello di controller. Ho provato a cercare dove avviene nel codice sorgente dell'oggetto Controller
, ma è piuttosto pazzesco.
So che posso creare manualmente un'istanza di IOptions e passarlo al costruttore MyHelper
, ma sembra che dovrei essere in grado di far funzionare il framework dal momento che funziona per Controllers
.
Il vostro aiuto è apprezzato.
Quando si utilizza l'iniezione di dipendenza non si chiama 'new'. Mai per oggetti che dovrebbero essere risolti – Tseng
Quando sto provando a creare un'istanza di MyHelper, non chiamo nuovo? (1) Sembra troppo facile, (2) Si tratta di un errore di sintassi. :-) –
Sì, questo è il punto principale dell'iniezione di dipendenza (soprattutto se si utilizza l'inversione dei contenitori di controllo che gestiscono e eseguono questa istanza). Per trasferire l'istanza al di fuori dei propri servizi/classi fino al punto in cui il contenitore di ioc esegue internamente questo. Nei casi in cui non è possibile iniettarlo tramite costruttore, creare una fabbrica e passare l'interfaccia di fabbrica al proprio servizio. l'implementazione di esso utilizza il contenitore per risolverlo, in caso di ASP.NET Core injecting 'IServiceProvider' nella tua factory e chiamando' IMyHelper helper = services.RequestService() ' –
Tseng