Disposizione manuale del contesto di Entity Framework durante l'utilizzo di Ninject InRequestScope ();

1

Passando un po 'di tempo a spulciare la documentazione, sto cercando di capire la migliore architettura software con o senza dispose pattern .

Ho costruito il Repository pattern molte volte nel corso degli anni, utilizzando il dispose pattern che è conforme alle "best practice". Uso attivamente Ninject in cui è presente la configurazione come segue:

/// <summary>
/// Starts the application
/// </summary>
public static void Start()
{
   DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
   DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
   bootstrapper.Initialize(CreateKernel);
}

/// <summary>
/// Load your modules or register your services here!
/// </summary>
/// <param name="kernel">The kernel.</param>
private static void RegisterServices(IKernel kernel)
{
   Bind<DBContext>().ToSelf().InRequestScope();
}

Come puoi vedere, abbiamo "OnePerRequestHttpModule" e "InRequestScope" per il Contesto DB, partendo dal presupposto che il "chiamante" di un oggetto che implementa il IDisposable sia responsabile per lo smaltimento di quell'oggetto.

Ho mai bisogno di dispose di un oggetto se è Ninject s responsabilità?

Ho più repository naïve che inietta il contesto in fase di esecuzione, con uno per richiesta http e il contesto di "in ambito di richiesta", quindi il contesto viene passato in giro nella vita di una richiesta.

La gioia di trovare una comprensione più profonda.

    
posta Tez Wingfield 26.03.2018 - 12:58
fonte

1 risposta

0

Secondo questo articolo di NInject WIKI, la risposta sarebbe no, if ...

link

OnePerRequestModule is an IHttpModule provided by Ninject that will hook the EndRequest callback and Dispose instances associated with ASP.NET's HttpContext.Current as part of the Ninject Kernel's Deactivation of tracked instances for you. You can register it using the following XML in your web.config

(Citato dalla fine della pagina)

C'è una sezione nell'articolo che tratta di garantire lo smaltimento prevedibile di oggetti non più necessari. Parla di azione NInject usando HttpContext come oggetto di scope per il kernel. Ciò significa che il kernel NInject viene eliminato quando il contesto viene eliminato, ma non è un tempo prevedibile.

La OnePerRequestHttpModule dispone di risorse contrassegnate in modo appropriato al termine della richiesta (ascolta il metodo di callback HttpContext.EndRequest ).

Poiché questi sono i passaggi che hai compiuto, non dovresti eliminarli da soli. Non sono sicuro di quanto Entity Framework gestisca più chiamate di eliminazione, ma alcune chiamate di eliminazione possono generare eccezioni se l'oggetto è già disposto.

    
risposta data 26.03.2018 - 15:01
fonte

Leggi altre domande sui tag