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?
DI - singleton lifetime + disposable dependency
-
audiotrack
VIP
- Príspevky: 25958
- Registrovaný: 09 sep 2005, 18:39
- Kontaktovať používateľa:
Re: DI - singleton lifetime + disposable dependency
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í.
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
- Príspevky: 8216
- Registrovaný: 27 máj 2009, 20:42
- Bydlisko: Bratislava
- Kontaktovať používateľa:
Re: DI - singleton lifetime + disposable dependency
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.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?
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
- Príspevky: 3690
- Registrovaný: 29 máj 2007, 21:53
- Bydlisko: Spálené mlyny
- Kontaktovať používateľa:
Re: DI - singleton lifetime + disposable dependency
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.
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.
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()
.
.
.
V tomto konkretnom pripade ziadne nepribudaju ani neubudaju. Ak sa take nieco fyzicky stane aplikacia vyzaduje pomerne rozsiahle prekonfigurovanie a restart.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.
Factory vo vnutri needy class je anti pattern. Needy class by nikdy nemala riadit zivot svojej dependency. Ak niekde volasharrison314 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).
Kód: Vybrať všetko
di = factory.Create()
di.DoSomething()
di.Dispose()
-
audiotrack
VIP
- Príspevky: 25958
- Registrovaný: 09 sep 2005, 18:39
- Kontaktovať používateľa:
Re: DI - singleton lifetime + disposable dependency
...mozem spravit resolve na dependency, ale neviem aky je spravny sposob jej injectovania (property setter? parameter metody?
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ť...a robit to cez property urcite nechcem
-
harrison314
Hardcore addict
- Príspevky: 8216
- Registrovaný: 27 máj 2009, 20:42
- Bydlisko: Bratislava
- Kontaktovať používateľa:
Re: DI - singleton lifetime + disposable dependency
V tomto pripade je tou zavislostou factory nie vytvarany objekt.axxis napísal:Factory vo vnutri needy class je anti pattern. Needy class by nikdy nemala riadit zivot svojej dependency. Ak niekde volas
Potom ti zostava iba odosvzdvanie danej zavisloti, ako parametru. To je najcistjsie riesnie.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.
-
axxis
Addict
- Príspevky: 3690
- Registrovaný: 29 máj 2007, 21:53
- Bydlisko: Spálené mlyny
- Kontaktovať používateľa:
Re: DI - singleton lifetime + disposable dependency
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)harrison314 napísal: V tomto pripade je tou zavislostou factory nie vytvarany objekt.
Anyway, dakujem Vam. Pouzijem parameter metody.