DI - singleton lifetime + disposable dependency

Programovacie jazyky, rady, poradňa...
axxis
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3690
Registrovaný: 29 máj 2007, 21:53
Bydlisko: Spálené mlyny
Kontaktovať používateľa:

DI - singleton lifetime + disposable dependency

Príspevok od používateľa axxis »

Mam problem s korektnym riesenim dependency injection pri pouziti objektov, ktore existuju pocas celeho zivota aplikacie ale potrebuju pre niektore operacie disposable dependency, viete ako sa tento problem spravne riesi?

Skusim byt trochu presnejsi, pri spusteni aplikacie sa vytvori N objektov, ktore reprezentuju konkretny fyzicky terminal, objekty su definovane menom.
Do aplikacie chodia requesty na jednotlive terminaly, ktorych obsluha vyzaduje vytvaranie disposovatelnych dependency, ktore ziju iba pocas reqestu. Keby terminaly nemali singleton zivot riesil by som to jednoducho ako Resolve pri kazdom requeste , kedze vsak nemozem zavolat new na ziadny objekt nemozem si dependency predat v konstruktore a robit to cez property urcite nechcem.

Vie niekto poradit aky je korektny sposob riesenia tohto problemu?
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: DI - singleton lifetime + disposable dependency

Príspevok od používateľa audiotrack »

skús byť trošku konkrétnejší, možno nejaká ukážka aspoň pseudokodu by pomohla. Prípadne aj o aký jazyk sa jedná, aby sme vedeli aké máme možnosti

Prečo to nemôžeš riešiť ako resolve pri každom requeste? To že je to singleton tam v princípe podľa mňa nič nemení.
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8216
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: DI - singleton lifetime + disposable dependency

Príspevok od používateľa harrison314 »

axxis napísal:Mam problem s korektnym riesenim dependency injection pri pouziti objektov, ktore existuju pocas celeho zivota aplikacie ale potrebuju pre niektore operacie disposable dependency, viete ako sa tento problem spravne riesi?

Skusim byt trochu presnejsi, pri spusteni aplikacie sa vytvori N objektov, ktore reprezentuju konkretny fyzicky terminal, objekty su definovane menom.
Do aplikacie chodia requesty na jednotlive terminaly, ktorych obsluha vyzaduje vytvaranie disposovatelnych dependency, ktore ziju iba pocas reqestu. Keby terminaly nemali singleton zivot riesil by som to jednoducho ako Resolve pri kazdom requeste , kedze vsak nemozem zavolat new na ziadny objekt nemozem si dependency predat v konstruktore a robit to cez property urcite nechcem.

Vie niekto poradit aky je korektny sposob riesenia tohto problemu?
Najskor mala pripomeinka, neviem ako to mas riesene, ani aky je navrh, ale nepride mi rozumne drzat objekty realneho sveta ako dependency v IoC kontainery, osobne by som sa tomu vyhol. Terminal podla mna moze pocas behu aplikacie pribudnut alebo odbudnut.

A moja odpoved, tu je to mozes riesit bud tak, ze budes dipsovatelne objekty odovdzavat parametrom. Alebo do terminalu budes injektovat factory pre konkretne disposovatelne zavislosti (je to standardny postup).
axxis
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3690
Registrovaný: 29 máj 2007, 21:53
Bydlisko: Spálené mlyny
Kontaktovať používateľa:

Re: DI - singleton lifetime + disposable dependency

Príspevok od používateľa axxis »

Jedna sa o C#, nie je pouzity ziadny DI kontajtner. Myslim vsak, ze riesenie tohto problemu je viac konceptualne ako viazane na jazyk.

A len aby som sa vyhodol pripadnym nedorozumeniam pripomenie, ze instancie maju singleton lifetime (v DI ponimani), nie su implementovane ako singleton.
Beh aplikacie je cca takyto.

Kód: Vybrať všetko

Application start
List.Add(new Terminal1)
List.Add(new Terminal2)
List.Add(new Terminal3)
--instancie vo vnutri listu nie su nikdy diposovoane, ziju az kym aplikacia neskonci (singleton lifetime)

->prichadzajuci request na Terminal1
    List.Find(Terminal1) --v tomto mieste nemozem robit resolve, pretoze instancia Terminalu zije pocas celeho behu aplikacie, mozem spravit resolve na dependency, ale neviem aky je spravny sposob jej injectovania (property setter? parameter metody?)
    Terminal1.UseMethodWithDisposableDependency()

->prichadzajuci request request na Terminal2
    List.Find(Terminal2)
    Terminal2.MethodThatCallsDependencyClass()

->prichadzajuci request request na Terminal1
    List.Find(Terminal1)
    Terminal1.MethodThatCallsDependencyClass()

.
.
.
harrison314 napísal:
Najskor mala pripomeinka, neviem ako to mas riesene, ani aky je navrh, ale nepride mi rozumne drzat objekty realneho sveta ako dependency v IoC kontainery, osobne by som sa tomu vyhol. Terminal podla mna moze pocas behu aplikacie pribudnut alebo odbudnut.
V tomto konkretnom pripade ziadne nepribudaju ani neubudaju. Ak sa take nieco fyzicky stane aplikacia vyzaduje pomerne rozsiahle prekonfigurovanie a restart.
harrison314 napísal:A moja odpoved, tu je to mozes riesit bud tak, ze budes dipsovatelne objekty odovdzavat parametrom. Alebo do terminalu budes injektovat factory pre konkretne disposovatelne zavislosti (je to standardny postup).
Factory vo vnutri needy class je anti pattern. Needy class by nikdy nemala riadit zivot svojej dependency. Ak niekde volas

Kód: Vybrať všetko

di = factory.Create()
di.DoSomething()
di.Dispose()
tak sa jedna o nespravne pouzitie DI, bezne referovane ako Control-Freak (v tomto konkretnom pripade by si sa Tvoje trieda stala zavislou na predpoklade, ze objekt je disposable ergo zavislou na implementacii). Teraz ma ale nechap zle, nevravim, ze take nieco nutne znici beh programu, tato tema je skor o tom aby som nasiel akademicky najcistejsie riesenie tohto problemu.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: DI - singleton lifetime + disposable dependency

Príspevok od používateľa audiotrack »

...mozem spravit resolve na dependency, ale neviem aky je spravny sposob jej injectovania (property setter? parameter metody?
...a robit to cez property urcite nechcem
podla mňa si si v týchto dvoch postoch odpovedal ako to robiť. Ja by som to riešil parametrom. Setter nie je optimálne riešenie vzhľadom na tú životnosť
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8216
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: DI - singleton lifetime + disposable dependency

Príspevok od používateľa harrison314 »

axxis napísal:Factory vo vnutri needy class je anti pattern. Needy class by nikdy nemala riadit zivot svojej dependency. Ak niekde volas
V tomto pripade je tou zavislostou factory nie vytvarany objekt.
axxis napísal:tak sa jedna o nespravne pouzitie DI, bezne referovane ako Control-Freak (v tomto konkretnom pripade by si sa Tvoje trieda stala zavislou na predpoklade, ze objekt je disposable ergo zavislou na implementacii). Teraz ma ale nechap zle, nevravim, ze take nieco nutne znici beh programu, tato tema je skor o tom aby som nasiel akademicky najcistejsie riesenie tohto problemu.
Potom ti zostava iba odosvzdvanie danej zavisloti, ako parametru. To je najcistjsie riesnie.
axxis
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3690
Registrovaný: 29 máj 2007, 21:53
Bydlisko: Spálené mlyny
Kontaktovať používateľa:

Re: DI - singleton lifetime + disposable dependency

Príspevok od používateľa axxis »

harrison314 napísal: V tomto pripade je tou zavislostou factory nie vytvarany objekt.
Toto nie je tak uplne pravda. Ale nechcem to tu vysvetlovat, lebo by to bolo na dlhsie. Ak mas zaujem mozes sa pozriet tu, kapitola 5.1 Control freak. (dokonca sa priamo pojednava o factory)

Anyway, dakujem Vam. Pouzijem parameter metody.
Napísať odpoveď