Il mio progetto è strutturato da servizi e repository (tutti i repository condividono il contesto db). In uno dei miei livelli di servizio, ho un metodo asincrono che scrive nel database usando un repository. La richiesta web terminerà e eliminerà il contesto prima che questo metodo possa essere utilizzato. Ho provato a capire NamedScopes come indicato in questo answer. Non riesco ancora a capire come implementarlo. Mostrerò come è strutturato il mio progetto e spero che qualcuno possa aiutarmi a livello di codice.NamedScopes Associazioni Ninject e asincrona (threading)
Binding
private static void RegisterServices(IKernel kernel)
{
//dbcontext
kernel.Bind<EntityDatabaseContext>().ToMethod(context => new EntityDatabaseContext()).InRequestScope();
//unit of work
kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope();
//repositories
kernel.Bind<IRepository<Account>>().To<Repository<Account>>().InRequestScope();
//services
kernel.Bind<IAuthenticationService>().To<AuthenticationService>().InRequestScope();
}
AuthenticationService utilizza iniezione costruttore
public AuthenticationService(UnitOfWork unitOfWork, IRepository<Account> accountRepository){}
Procedimento dentro il mio AuthenticationService
//this is a background process
public Task SomeMethodAsync(string text)
{
//spin it off into a new task
return Task.Factory.StartNew(() => SomeMethod(text));
}
SomeMethod
fa uso di accountRepository
. Per favore dimmi se sono necessarie ulteriori informazioni. Per favore aiutatemi con il problema del threading, se NamedScopes è la soluzione, come posso implementarla nel mio caso?
Fondamentalmente, un processo in background è in esecuzione e sta utilizzando un contesto che viene eliminato da ninject a causa dell'ambito della richiesta.
Potresti per favore elaborare quello che vuoi ottenere? Vuoi semplicemente caricare alcuni dati nel tuo metodo SomeMethodAsync in modo asincrono o vuoi eseguire in background alcune informazioni in un lavoro come moda? Uno dei problemi principali nella progettazione è che stai iniziando direttamente una nuova attività in SomeMethodAsync. L'avvio di una nuova attività non promette l'esecuzione dell'attività.Le attività potrebbero essere eseguite dopo che la richiesta è terminata e quindi ninject avrà già disposto nell'ambito della richiesta. Se si utilizza AsyncController, l'attività dovrebbe essere registrata su di essa. Ma l'API non dovrebbe avviarlo –
@DanielMarbach Questo è il mio problema, il compito può essere eseguita dopo le estremità di richiesta e dispone Ninject del contesto. Devo dire che devo aspettare. Non sono sicuro di come si faccia. –
@DanielMarbach, cosa intendi con cui l'API non dovrebbe avviarlo? –