Sto usando l'iniezione di dipendenza per registrare il mio DbContext nel controller di un'applicazione ASP.NET MVC Core come questo:
public void ConfigureServices(IServiceCollection services) {
return new MyContext(connectionString); }
services.AddScoped<IMyContext, MyContext>((serviceProdiver) => {
return new MyContext(Configuration["ConnectionStrings:MyContext"]);
});
services.AddMvc();
}
Funziona bene Ma ora voglio usare Migrazioni come Add-Migration Initial -Context MyContext
che richiede un costruttore senza parametri. Ma questo distruggerebbe il pattern DI perché avrei bisogno di ricorrere al modello singleton dal classico ASP.NET MVC come il seguente:
public class MyContext:MySqlDbContext, IMyContext {
public MyContext() : base(Startup.Configuration["ConnectionStrings:MyContext"] {
}
}
Mi piace evitare questo per utilizzare di conseguenza DI nel mio nuovo progetto ASP.NET Core. È possibile utilizzare le migrazioni di database o non è ancora lo strumento di migrazione aggiornato per DI in modo che non ci siano alternative per utilizzare il vecchio schema di singleton qui?
Wow, hai fatto un grosso errore. Non è necessario aggiungere alcuna configurazione a MyContext, perché è un file generato automaticamente. Che cosa hai da fare? È necessario aggiungere alcuni file di configurazione, ad esempio RegisterServices o sarà un'estensione. Per esempio
public static class ServiceCollectionExtensions
{
public static IServiceCollection RegisterServices(
this IServiceCollection services)
{
services.AddTransient<ICountryService, CountryService>();
// and a lot more Services
return services;
}
}
E dopo questo devi registrare questo file di configurazione in ConfigureServices, per esempio
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc();
services.RegisterServices();
}
Infine, puoi utilizzare Servizi o Archivi
public class HomeController : Controller
{
private readonly ICountryService _countryService;
public HomeController(ICountryService countryService)
{
_countryService = countryService;
}
// …
}
Oppure, al momento è nuovo in ASP.NET Core MVC, che possiamo anche inserire questo servizio in una vista MVC. La seguente riga definisce l'iniezione in una vista Razor:
@inject DiViews.Services.ICountryService CountryService;
La prima parte dopo la direttiva @inject definisce l'interfaccia. La seconda parte è il nome della variabile che contiene la nostra istanza.
Per iniettare un servizio globalmente in tutte le viste, aggiungi questa riga a _ViewImports.cshtml. In un nuovo progetto ASP.NET Core completo, esiste già un'iniezione globale definita per ApplicationInsights:
@inject Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration TelemetryConfiguration
Ora siamo in grado di utilizzare l'istanza a nostro avviso:
@if (countryService.All().Any())
{
<ul>
@foreach (var country in CountryService.All().OrderBy(x => x.Name))
{
<p>@country.Name (@country.Code)</p>
}
</ul>
}
Possiamo anche utilizzare questo servizio per riempire campi selezionati con l'elenco dei paesi:
@Html.DropDownList("Coutries", CountryService.All()
.OrderBy(x => x.Name)
.Select(x => new SelectListItem
{
Text = x.Name,
Value = x.Code
}))
Spero sia stato utile per te