[ Valerij Zajcev @ 08.07.2010. 18:29 ] @
Postavio sam skoro temu na PHP forumu. Da li ima razlike kako sa singletonom radi ASP.NET i PHP? Kako kontam kod PHP-a singleton je u PHP-u single samo u toku jednog HTTP request-a, da li je tako i u ASP skriptama?
[ toxi_programer @ 08.07.2010. 19:20 ] @
Šabloni opisuju način za rešavanja odgovarajućeg problema. Da li ćeš ih ti implementirati baš u izvornom obliku, prilagođeno tehnologiji koju koristiš ili potrebama same aplikacije, na tebi je. To bi bio odgovor na pitanje "da li je isto u asp.net-u i php-u".

Zanimljiv detalj kod Singletona je što koristi static instancu objekta (u svom izvornom obliku).
Obzirom da IIS ( i drugi, jeli) rade sa više niti( svaki posetilac će imati nit unutar istog servera) ako implementiraš Singleton doslovno, objekat koji on vraća neće biti na nivou jednog posetioca već na nivou svih posetilaca( jer je instanca static, pa je dostupna svima na nivou aplikacije).
Redak je slučaj kad će ti ovakvo ponašanje biti potrebno u web programiranju.

No, šablon se često prilagođava tako da odgovara onom što tebi treba. Na primer, želiš da ti neki objekat bude dostupan na nivou jednog zahteva( jednog posetioca sajta) ali da svaki posetilac ima zasebnu instancu tog objekta. To možeš uraditi tako što ćeš, umesto da držiš static instancu držati običnu instancu objekta čuvajući je, na primer, u HttpContext-u.

Evo primer gde sam koristio malo izmenjen singleton tako da mi, na nivou zahteva, upravlja LINQ-ovim DataContext-om:

Code:

     public class DataProvider
    {
        private DataProvider()
        {

        }

        public static CmsDataDc CmsDataContext()
        {
            if (HttpContext.Current.Items["cmsData"] == null)
                HttpContext.Current.Items["cmsData"] = new CmsDataDc();
            return (CmsDataDc)HttpContext.Current.Items["cmsData"];
        }

        public static void SubmitChanges()
        {
            CmsDataContext().SubmitChanges();
        }
    }


[ mmix @ 08.07.2010. 19:39 ] @
http://www.elitesecurity.org/p2624785
[ toxi_programer @ 09.07.2010. 14:03 ] @
Milane,

Možeš li nešto više reći o worker procesima? Recimo, da li pokretanje novog worker procesa može da naruši stanje u slučaju primera koji sam gore naveo. Deluje mi nelogično da se prekida request na pola puta i prebacuje negde drugde ali šta znam kako li to radi
[ branimir.ts @ 28.08.2010. 14:12 ] @
Code:

public class DataProvider
    {
        private DataProvider()
        {

        }

        public static CmsDataDc CmsDataContext()
        {
            if (HttpContext.Current.Items["cmsData"] == null)
                HttpContext.Current.Items["cmsData"] = new CmsDataDc();
            return (CmsDataDc)HttpContext.Current.Items["cmsData"];
        }

        public static void SubmitChanges()
        {
            CmsDataContext().SubmitChanges();
        }
    }

...nije thread -safe, moze se desiti da vise threadova u isto veme pristupi statickoj metodi CmsDataContext klase DataProvider.
Isto tako se ne bih slozio sa tobom da se singleton pathern ne koristi u web aplikacijama = naprotiv;

Singleton pathern za ASP NET bi mogao da izgleda ovako (obrati paznju na staticki konstruktor) :
Code:

public class DataProvider
    {
        // -----------------------------------------------------------------------------------------------
        private static volatile DataProvider minstance;
        private DataProvider()
        {
        }

        static DataProvider()
        {
            minstance = new DataProvider();
        }

        public static DataProvider Instance
        {
            get { return minstance; }
        }

[ mmix @ 28.08.2010. 14:25 ] @
Ajd jos jednom procitaj post i o cemu sam ja pisao.
[ branimir.ts @ 28.08.2010. 14:37 ] @
Ma vazi :)
[ toxi_programer @ 31.08.2010. 13:48 ] @
@branimir.ts
Naravno da jeste thead safe. Funkcija jeste statička, ali bitan deo - mesto gde čuvaš ono što želiš da čuvaš kroz ceo page life cycle -je urađen na nivou sesije korisnika, bez ikakvih "static" svojstava.

Drugo, ja sam rekao da singleton može da se koristi na webu, ali u prilagođenoj formi. Kao i svaki pattern što se prilagođava potrebama.
[ branimir.ts @ 31.08.2010. 19:42 ] @
@Toxy u, pravu si
Citat:
HttpContext.Current.Items["cmsData"] = new CmsDataDc();
... i kada bi dva ili vise thread-a (request-a) ako pricamo o web-u izvrsila ovaj deo, nista se lose ne bi moglo desiti. Opasno bi bilo nesto poput ovog
Citat:
HttpContext.Current.Items["cmsData"] = cmsDataDc (tj referenca na nesto)
. Izvini na misinterpretaciji...

Reci cu nesto za ovo = "Recimo, da li pokretanje novog worker procesa može da naruši stanje u slučaju primera" - ako se dva worker procesa ne preklapaju i ne dele resurse, stanje koje imas u procesu ce ostati isto i request nece biti prekinut (logicno). Ja kapiram da si u stvari pitao sta ce se desiti sa instancom objekta koja se nalazi u http context-u ako se sesija cluster-uje na vise servera - moj odgovor je da se nista lose nece desiti jer app server (a.k.a. proces) zna kako da komunicira sa serverima na kojima se nalazi seansa. Downside ovog nacina konfiguracije okruzenja je performance penalty pri serijalizaciji / deserijalizaciji.
[ mmix @ 31.08.2010. 20:19 ] @
A kakve sve to veze ima sa singletonom? Singleton ne mozete da adaptirate webu jer onda vise nije singleton Al dobro, kad je mogao asp.net mvc da se zove mvc-om, valjda i ova budzevina moze da prodje kao singleton.
[ toxi_programer @ 31.08.2010. 21:30 ] @
Citat:
Al dobro, kad je mogao asp.net mvc da se zove mvc-om, valjda i ova budzevina moze da prodje kao singleton.


Hahaha, baš fino rečeno za asp.net mvc

Citat:
Ja kapiram da si u stvari pitao sta ce se desiti sa instancom objekta koja se nalazi u http context-u ako se sesija cluster-uje na vise servera - moj odgovor je da se nista lose nece desiti jer app server (a.k.a. proces) zna kako da komunicira sa serverima na kojima se nalazi seansa. Downside ovog nacina konfiguracije okruzenja je performance penalty pri serijalizaciji / deserijalizaciji.


'fala na razjašnjenju
[ branimir.ts @ 31.08.2010. 21:47 ] @
@Toxy nema na cemu.

@Mix -
Citat:
Singleton ne mozete da adaptirate webu jer onda vise nije singleton
- ovo je vecita tema diskusija i svodi se uglavnom na to - sta je starije kokoska ili jaje. Ne znam koliko si upucen u ASP NET MVC ili koliko nisi ali ono sto znam je da - koju god tehnologiju da koristis koristices je verovatno na dobar ili na los nacin.


[Ovu poruku je menjao mmix dana 28.09.2010. u 12:00 GMT+1]
[ mmix @ 28.09.2010. 11:00 ] @
[mod: iz razdvojene teme]

Kakva crna vecita diskusija Samo zato sto je nesto izaslo iz redmonda ne znaci da ceo svet treba da se prilagodi njihovim terminima.

Singleton je singleton, ako ne ispostujes pravila tog paterna onda to vise nije singleton i to nema nikakve veze sa hardcore linijom i time dal je prvo bila kokoska ili jaje, fakat je da je prvo bio singleton patern i da je on dobio to ime. Da li se iko seca kako su paterni uopste usli u nase zivote? Sustainable, well documented approach to achieving development tasks using recognizable patterns KNOWN TO ALL participants. Ako ti uzmes patern i onda ga izmenis za svoju svrhu to vise nije taj patern. On je mozda patern ako ima neku generalniju primenu i mozda je napredak u odnosu na stari patern ali nije TAJ patern i ne treba ga podmetati pod tim imenom, sto je nesto sto microsoft radi na skoro dnevnoj osnovi i onda imas gomilu MS-only developera koji tvrde da je nesto patern samo zato sto je u MS proizvodu tako nazvano i vodeci se istom logikom pisu kod koji nije patern-based ali ga dokumentuju kao takvog. A to je vec problem.