29. november 2012 - 19:03Der er
41 kommentarer og 1 løsning
Globalt objekt
Ok, jeg har tidligere herinde fået et forslag om at bruge et singleton pattern til at lave et globalt object, jeg kan tilgå fra diverse steder i kode.
Nu er det sådan, jeg har lavet en singleton i mit UI lag, som jeg gerne vil bruge i mine øvrige lag.
Hvordan gøre jeg det bedst? Skal jeg placere min singleton et andet sted? eller skal jeg parse mit singleton object gennem en metode til fx. mit dataadgangs project? Jeg efterlyser en pæn måde at gøre det på.
Det fede vil være at jeg fra mit dataadgangs projekt kan tilgå min singleton uden at lave en reference til mit UI lag i mit dataadgangs lag.
Det er ligesom at spoerge om det er bedst at skyde sig selv i foden med en riffel eller et haglgevaer.
:-)
Du kan vaelge mellem: 1) sende med som argument til de underliggende lag (hvilket straks rejser spoergsmaalet om hvorfor saa ikke den metode ogsaa bruges internt i UI) 2) lade underliggende lag referere lag ovenover, hvilket er meget daarligt design *og* vil kunne give build problemer. 3) lave utility lag som bruges af baade PL, BLL og DAL - det er i sig selv en helt OK loesning, men din singleton vil i den model begynde at ligne et "god object" lidt for meget
Hvad med at smide det ind i et session objekt, men det betyder vel at HttpContext namespacet skal være tilgængelig i mit dataadgangs lag...hvilket ikke er et pænt design...
Findes der ikke et globalt store af en eller anden art, der ligger et neutralt sted?
Et af mine egne objekter, som jeg sætter i en singleton klasse. Nu tænker jeg højt, kan jeg evt. bruge min ioc container til det? Jeg bruger nemlig sådan een i min løsning.
Så jeg er stadigvæk på herrens mark? :S Jeg må vel gå i tænkteboxen.
Kan jeg evt. bruge min utils project til at læse en given singleton fra min UI lag? min utils er nemlig refereret i alle mine c# projects og spænder over dem. Jeg vil helst ikke lægge min singleton i utils. Så hellere læse den fra min utils og tilbyde den til de øvrige lag...
Ok...skal lige tænke over mine referencer. Hvis mit UI lag har en reference til min Utils, så kan jeg ikke læse objekter fra fra UI i min utils klasse. :S
He he he sarkasme er lidt svært at afkode i skreven tekst, men ja, det er nok ikke helt rigtigt at gøre det.
Har dog et tillægsspørgsmål. Hvis du skulle kode noget, der skulle holde på noget key value agtigt, så kan man vel lave sin egen settings klasse.
Jeg forsøger at finde, den helt rigtige måde at gøre det på, men der er noget der hedder SettingsBase og SettingsContext, og jeg ved ikke helt om det er dem jeg skal bruge.
namespace E { public class MyConfig : ConfigurationSection { [ConfigurationProperty("foo")] public int Foo { get { return (int)this["foo"]; } } [ConfigurationProperty("bar")] public string Bar { get { return (string)this["bar"]; } } } public class Program { public static void Main(string[] args) { MyConfig cfg = (MyConfig)ConfigurationManager.GetSection("myconfig"); Console.WriteLine(cfg.Foo + " " + cfg.Bar); } } }
Jeg endte med at gøre en hashtable som en del af min singleton.
Jeg har dog en bekymring, min singleton bliver født een gang, og under denne 'fødsel' indlæser jeg nogle værdier ind i en hashtable. Denne hashtable har jeg lavet en get property på i en abstract klasse som min singleton implementerer:
MinSingleton : MinabstraktKlasse
min forventning var egentlig at mine værdier blev indlæst første gang. Dog oplever jeg, at ramme et break point i min indlæsning.
Min forventning var at dette ikke ville ske. Min singleton er er fin nok, men i anden klasse som min singleton nedarver fra, rammer jeg ind i en metode mere end een gang.
Jeg bliver nødt til at spørge dette, da jeg er blevet meget i tvivl.
Jeg har med succes fået lavet min singleton, der holder på nogle applikaitonsfaste værdier. Dog har jeg tilføjet et bruger objekt, som en del af min singleton.
Min forestilling var, at min singleton levede, så længe en bruger var aktiv, og så snart hans session var overstået, så ville min singleton blive nedlagt.
Jeg oplever under debug at min bruger er den samme som debug sessionen før, selvom jeg faker med en ny bruger.
Er det forkert at sætte den aktuelle indloggede bruger, som en del min singleton?
De andre værdier er faste, så der er ingen problemer der.
Spørgsmålet er mere præcist, hvornår en singleton 'dør'. Er det ved en slutningen af en igangværende session? Eller først under en iisreset eller en inaktivering af et website?
...endnu et tillægs spørgsmål. Jeg har lagt min singleton i min utils. Denne utils dll ligger i GAC. Hvis denne utils skal bruges i forbindelse med en anden applikation, vil den forriges applikations state gælde for den nye?
Hvis det gør det, så har jeg også problemer. Jeg håber, singleton bliver sat pr. ovenliggende applikationer, og gennem forskellige 'applikationstråde'.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.