Sto installando un progetto ASP.NET Core e seguendo uno schema CQRS basando il mio lavoro sul progetto Treppiede . Ho seguito la guida all'integrazione di Simple Injector ma un po 'perplesso su un punto ... Voglio continuare a utilizzare l'opzione UseInMemoryDatabase
per i test e posso trovare solo esempi di ciò usando il metodo Core DI AddDbContext
.
My DbContext implementa diverse interfacce:
public class EntityDbContext : DbContext,
IUnitOfWork,
IReadEntities,
IWriteEntities
{
// code here
}
Lo sto facendo nel metodo Startup.ConfigureServices
:
services.AddDbContext<EntityDbContext>(options => options.UseInMemoryDatabase("Snoogans"));
e seguendo l'integrazione SI guida questo nel metodo Startup.Configure:
container.Register<IUnitOfWork, xxxx>();
container.Register<IReadEntities, xxxx>();
container.Register<IWriteEntities, xxxx>();
Sono in grado di ottenere la registrazione Core tramite crosswire per il plug-in alla destinazione per ciascuno di essi o devo semplicemente registrare il contesto direttamente in SI?
== Sto giocando con il concetto originale di Treppiede:
var contextRegistration =
lifestyle.CreateRegistration<EntityDbContext, EntityDbContext>(container);
container.AddRegistration(typeof(EntityDbContext), contextRegistration);
container.AddRegistration(typeof(IUnitOfWork), contextRegistration);
container.AddRegistration(typeof(IWriteEntities), contextRegistration);
container.AddRegistration(typeof(IReadEntities), contextRegistration);
cercando di fare tutto con SI, ma non sono sicuro di come ottengo alla registrazione per le 3 interfacce:
container.Register<EntityDbContext>(() =>
{
var optionsBuilder =
new DbContextOptionsBuilder<EntityDbContext>().UseInMemoryDatabase("Snoogans");
return new EntityDbContext(optionsBuilder.Options);
});
container.AddRegistration<IUnitOfWork>(xxxx);
container.AddRegistration<IReadEntities>(xxxx);
container.AddRegistration<IWriteEntities>(xxxx);
Sono in grado di ottenere la registrazione Core tramite crosswire per il plug-in alla destinazione per ciascuno di essi o devo semplicemente registrare il contesto direttamente in SI?
Entrambe le opzioni sono possibili. È possibile scegliere di registrare DbContext direttamente in Simple Injector. Questa sarebbe in genere la scelta più ovvia in quanto DbContext è un componente dell'applicazione. I componenti dell'applicazione devono in genere essere registrati nel contenitore dell'applicazione (ad es. Simple Injector) anziché nel sistema di registrazione del framework (ad es. ServiceCollection
).
Quando si tratta di registrare DbContext
, tuttavia, esiste una stretta integrazione con il sistema di configurazione ASP.NET Core. Ciò può rendere più semplice effettuare la registrazione lì e semplicemente eseguire il cross-wire da Simple Injector. Ciò consente al sistema di configurazione di avere il controllo sulla creazione e distruzione di DbContext. Ciò diventa particolarmente utile quando si eseguono operazioni come il pooling DbContext, poiché questa funzionalità di pooling è strettamente associata a questa API di configurazione e registrazione.
In genere, entrambe le opzioni sono piuttosto semplici, ma poiché DbContext implementa più interfacce che si desidera registrare separatamente, ciò rende le registrazioni più complicate. Questo sarebbe stato il caso anche nel caso in cui si stia utilizzando anche il contenitore DI incorporato, quindi questo non è specifico per Simple Injector.
Nel tuo caso, fare le registrazioni puramente in Simple Injector sarebbe simile al seguente:
var reg = Lifestyle.Scoped.CreateRegistration(() =>
{
var optionsBuilder =
new DbContextOptionsBuilder<EntityDbContext>().UseInMemoryDatabase("Snoogans");
return new EntityDbContext(optionsBuilder.Options);
},
container);
container.AddRegistration<IUnitOfWork>(reg);
container.AddRegistration<IReadEntities>(reg);
container.AddRegistration<IWriteEntities>(reg);
Nel caso in cui si scelga di eseguire il cablaggio incrociato di DbContext dal sistema di configurazione .NET Core, la configurazione sarà simile al seguente:
// Add to the built-in ServiceCollection
services.AddDbContext<EntityDbContext>(options => options.UseInMemoryDatabase("Snoogans"));
// Cross-wire in Simple Injector
container.CrossWire<EntityDbContext>(app);
// Pull that registration out of Simple Injector and use it for the interface registrations
var reg = container.GetRegistration(typeof(EntityDbContext)).Registration;
// Same as before
container.AddRegistration<IUnitOfWork>(reg);
container.AddRegistration<IReadEntities>(reg);
container.AddRegistration<IWriteEntities>(reg);
Se non utilizzi Simple Injector, ma puramente il DI Container incorporato di .NET Core, la registrazione sarebbe simile alla seguente:
services.AddDbContext<EntityDbContext>(options => options.UseInMemoryDatabase("Snoogans"));
services.AddScoped<IUnitOfWork>(c => c.GetRequiredService<EntityDbContext>());
services.AddScoped<IReadEntities>(c => c.GetRequiredService<EntityDbContext>());
services.AddScoped<IWriteEntities>(c => c.GetRequiredService<EntityDbContext>());