Guardando gli esempi di come usare db context pool vedo che è stato progettato per essere utilizzato con ServiceCollection
:
var serviceProvider = new ServiceCollection()
.AddDbContextPool<AdventureWorksContext>(options => { //options })
.BuildServiceProvider();
Ma per quanto riguarda Simple Injector? è possibile registrare il pool di database nel contenitore Simple Injector?
ps La mia app non è ASP.NET MVC, è solo un tipo di DAL
Quando si integra Simple Injector in ASP.NET Core, si mantengono framework e componenti di terze parti all'interno del sistema di configurazione .NET Core. Ciò significa che l'abilitazione del pool di contesto di Entity Framework Core viene eseguita esattamente come Microsoft la documenta:
services.AddDbContextPool<BloggingContext>(
options => options.UseSqlServer(connectionString));
As Simple iniettore non sostituisce il built-in sistema di configurazione , si dovrà indicare l'iniettore Semplice da caricare automaticamente le registrazioni mancanti (come il tuo DbContext
) dal sistema di configurazione .NET Nucleo. Questo può essere fatto usando i metodi di estensione AddSimpleInjector
e UseSimpleInjector
, come mostrato qui.
private SimpleInjector.Container container;
public void ConfigureServices(IServiceCollection services)
{
...
services.AddDbContextPool<BloggingContext>(
options => options.UseSqlServer(connectionString));
services.AddSimpleInjector(container, options =>
{
options.AddAspNetCore();
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseSimpleInjector(container);
container.Verify();
...
}
Usando questa configurazione, BloggingContext
può essere iniettato in qualsiasi componente che viene risolto da Simple Injector, mentre BloggingContext
è raggruppato da Entity Framework.
Quando si tratta di utilizzare il pool di contesti Entity Framework Core in un'applicazione console .NET Core, la soluzione sarà molto simile, anche se sarà necessario impostare un po 'di più:
public void Main()
{
var container = new Container();
container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
var services = new ServiceCollection();
services.AddDbContextPool<BloggingContext>(
options => options.UseSqlServer(connectionString));
services.AddSimpleInjector(container);
services
.BuildServiceProvider(validateScopes: true)
.UseSimpleInjector(container);
container.Verify();
// Run application code
using (AsyncScopedLifestyle.BeginScope(container))
{
var service = container.GetInstance<MainService>();
service.DoAwesomeStuff();
}
}
Quindi, alla fine, la durata del DbContext è gestita dall'ambito MS.DI, ma tale ambito è gestito dall'ambito di Simple Injector.
Nel caso in cui si stia creando una libreria, ovvero un progetto non di avvio, interrompere ciò che si sta facendo. Solo l'assembly di avvio dell'applicazione dovrebbe avere un Root di composizione e solo il Root di composizione dovrebbe utilizzare un contenitore DI (come Simple Injector o `ServiceCollection di MS.DI). Tutte le altre librerie nella tua applicazione dovrebbero rimanere ignari della (possibile) esistenza di un Contenitore:
Nel caso in cui si utilizzi un contenitore DI, la radice della composizione dovrebbe essere l'unico posto in cui si utilizza il contenitore DI. L'uso di un contenitore DI all'esterno della Root di composizione porta all'anti-pattern di Service Locator ( sorgente )