Diskuze: Použití Dispose
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 13 zpráv z 13.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Ten DBContext ti mezi různýma requestama zůstává nebo pro kazdej request vytvaris novej?
Děkuji ti za odpověď.
Mělo by mi zůstávat stejný, protože si ho předávám přes konstruktor a
mám ho v DI. Funguje mi to zhruba takhle:
Mám abstraktní třídu BaseManager - zde mám obecný metody jako GetAll(),
Delete() atd.
Mám zde následující kód.
public abstract class BaseManager<TEntity, TContext> : IBaseManager<TEntity> where TEntity : class where TContext : DbContext, new()
{
public BaseService(TContext con)
{
Con = con;
}
public TContext Con { get; }
A následné použití.
public partial class TestManager : BaseManager<Test, StoreUrbanDBContext>, ITestManager
{
public AdvertisementService(DBContext con) : base(con)
{
}
}
public partial interface ITestManager : IBaseManager<Test>
{
}
A takhle si to předám u každýho manageru. Takže by to měl být jeden objekt ne? A to dispose mi ten objekt vlastně uvolní, takže je muj dotaz nesmysl?
Pokud ti DB zustava porad otevrena, tak idealni by bylo ten Dispose tam mit (aby se spojeni ukoncilo spojeni treba pri zavirani aplikace apod.), ale nevolat ho nikde rucne, kdyz vlastne to pripojeni zustava mezi pozadavkama.
Aha chápu! Jenom se teda ještě radši zeptám. Co tedy přesně dělá ten Dispose? U každého objektu něco jiného? U čtení ze souboru například soubor zavře a u DB například ukončí spojení? A ten Dispose se mi automaticky spustí při zavření aplikace? Nebo to musím dodělat?
Dispose je volano budto kdyz ho nekdo zavola rucne, to je treba i na konci bloku using https://docs.microsoft.com/…ng-statement a nebo kdyz ten objekt maze GC (tam se vola Finalize, ve kterem ten Dispose musis zavolat a nebo muzes pouzit SafeHandle, viz https://docs.microsoft.com/…ting-dispose ).
Jeho ukolem je vycistit vsechny unmanaged data, ktery ta trida vytvorila -
pozavirat vsechny otevrene soubory, spojeni do DB, handly na vsechno mozny , pripadne treba uvolnit unmanaged
pamet, ...
pokud neco takovyho ta trida pouzivala.
Pokiaľ používaš Dependency Injection, podľa mňa by si sám Dispose volať nemal. To by mal riešiť DI kontajner, v žiadnom prípade nie ty.
Oběma děkuji za odpověď. Chápu tedy, že metodu Dispose nemám nikdy
používat. A mám si ji tedy doprogramovat?
V té třídě BaseManager? Zhruba nějak podle této stránky? - https://docs.microsoft.com/…ting-dispose
Nie že by si nemal Dispose nikdy používať. Toto je jednoducho problém toho, keď sa stavia mrakodrap a my už ideme robiť 5. poschodie, keď na 3. ešte ani nie sú všetky podpery hotové.
Dispose implementujú triedy, ktoré pracujú s tzv. unmanaged resources (napríklad spojenia k súborom, otvorené spojenia po sieti, občas rôzne buffery atď., proste hocičo, čo garbage collector neuprace sám). Je potom nepísanou povinnosťou kódu, ktorý potom s týmito triedami pracuje, aby sa o zavolanie tejto metódy postaral. To sa väčšinou robí tým, že sa s takýmito objektami jednoducho pracuje v using bloku, manuálne sa Dispose volá málokedy.
Tvoj problém je ale v tom, že nie tvojou zodpovednosťou je zavolať na databázovom kontexte Dispose, ale je to logicky povinnosť DI. Tá ten kontext vytvára a spravuje ho, od vzniku po zánik a teda aj Dispose.
Ano, jestli dobre chapu, ze ta DBContext trida je nejaka tvoje trida, pak by Dispose rozhodne mit mela, ale volat by jsi ji tady v tom pouziti co popisujes nemel, jak jsem psal uz vejs.
Zase děkuji za supr ujasnění a poslední dotaz. Zde nejde přímo o třídu DBContext. Používám EF DB First. Takže si to do toho DBContextu nemůžu ani zapsat. Ale pro komunikaci s databází používám právě ty Managery a předávám si to přes ten konstruktor. Takže v té třídě BaseManager si zdědím IDispose a doprogramuju si metodu Dispose, kde vlastně zavolám Con.Dispose() ano?
Ne.
Pokud je ten DBContext nejaka existujici DB trida uz od nejakeho frameworku, tak
Dispose vubec neres.
Ani ho nikam nepridavej, ani ho nevolej, ten framework si tohle vsechno
resi.
Dispose se resi (v 99% pripadu) jen na te tride, co ma primo drzi ty unmanaged zdroje.
Ja totiz puvodne to pochopil tak, ze ten DBContext je nejaka tvoje trida pro praci s DB.
Jj je to od entity frameworku. Ale kdyz se do ty tridy podivam jsou tam jenom DbSety. Ale to je teda jedno nemam to resit jo?
Zobrazeno 13 zpráv z 13.