Il modello Opzioni mi ha permesso di creare oggetti opzioni contenenti valori dalla configurazione, come descritto qui: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options
Ho bisogno dei valori per un oggetto opzione all'interno di un'implementazione IDesignTimeDbContextFactory, che devono essere utilizzati da EF durante la creazione dei modelli. (I valori in quella sezione di configurazione verranno utilizzati per il seeding dei dati, quindi ho aggiunto IOptions al costruttore del contesto DB.)
Dato che non ho accesso a IServiceCollection (dato che è tempo di progettazione, come quando eseguo "dotnet ef migrations add", ho bisogno di avere un altro modo per convertire un IConfigurationSection (che rappresenta la sezione che mi interessa) nella mia classe personalizzata Opzioni.
Posso sapere come posso farlo senza iniezione di dipendenza?
È possibile utilizzare il metodo di estensione Bind(Configuration, object)
per eseguire l'associazione manuale di qualsiasi object
. Ecco un esempio:
var myCustomOptions = new MyCustomOptions();
myConfigurationSection.Bind(myCustomOptions);
// Use myCustomOptions directly.
Per racchiuderlo in un IOptions<T>
, usa Options.Create
:
IOptions<MyCustomOptions> myOptions = Options.Create(myCustomOptions);
ServiceCollectionContainerBuilderExtensions rende questo lavoro in SoapCore
La parte della mia applicazione ha funzionato così:
services.AddSingleton<IRESAdapterService>(new RESAdapterService(
new XController(
services.BuildServiceProvider().GetRequiredService<IOptions<XApiSettingsFromJsonClass>>(),
_xLogger
)));
Utilizzabile anche nell'integrità unittests