Sto creando un'applicazione di servizio utilizzando Web API, .Net Core e EntityFramework Core.
Per la configurazione delle opzioni nel mio DbContext sto usando queste righe nel metodo "ConfiguraServices" in Startup.cs
var connection = @"Server=ISSQLDEV;Database=EventManagement;Trusted_Connection=True;";
services.AddDbContext<EMContext>(options => options.UseSqlServer(connection));
So che se aggiungo il contesto come parametro costruttore nel controller .Net inietterà il contesto nel costruttore.
Ma questo non è il comportamento che voglio. Non voglio che la mia web API sappia qualcosa sul dbcontext. Ho un progetto DataAccess con una classe repository che gestisce tutte le operazioni CRUD.
Ciò significa che voglio solo dire Repository.AddEvent (evt) nel mio controller e quindi repository sa come gestirlo.
D'altra parte, il repository utilizza un semplice resolver di dipendenza per ottenere l'implementazione corretta di "IDataAdapter". Una di queste implementazioni è SQLDataAdapter. Questo è il punto in cui ho bisogno del mio contesto.
Come posso passare il mio contesto fino a questo punto?
Puoi risolverlo aggiungendo il tuo dbcontext tramite iniezione del costruttore alle tue classi dal tuo livello di accesso ai dati.
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(o => o.UseSqlServer(myConnStr));
services.AddScoped<Repository>(); // 'scoped' in ASP.NET means "per HTTP request"
}
}
public class MvcController
{
private Repository repo;
public MvcController(Repository repo)
{
this.repo = repo;
}
[HttpPost]
public void SomeEndpoint()
{
this.repo.AddFoo(new Foo());
}
}
public class Repository
{
private DbContext db;
public Repository(ApplicationDbContext db)
{
this.db = db;
}
public void AddFoo(Foo obj)
{
this.db.Set<Foo>().Add(obj);
this.db.SaveChanges();
}
}
Se vuoi personalizzare ulteriormente il modo in cui il tuo DbContext viene iniettato nel tuo contenitore DI, ti suggerisco di vedere cosa sta facendo realmente .AddDbContext
. Vedi https://github.com/aspnet/EntityFramework/blob/1.0.0/src/Microsoft.EntityFrameworkCore/EntityFrameworkServiceCollectionExtensions.cs#L142-L158