Avatar billede CodingJoe Nybegynder
29. november 2012 - 19:03 Der 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.

Sprøde points til det bedste forslag. :P
Avatar billede arne_v Ekspert
29. november 2012 - 19:11 #1
Der er naeppe nogle gode forslag.

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
Avatar billede CodingJoe Nybegynder
29. november 2012 - 19:28 #2
Lækkre kommentarer..

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?
Avatar billede CodingJoe Nybegynder
29. november 2012 - 19:30 #3
Avatar billede CodingJoe Nybegynder
29. november 2012 - 19:46 #4
Troede ApplicationState var en del af .net frameworket...
Avatar billede arne_v Ekspert
29. november 2012 - 19:51 #5
ASP.NET har et par singleton lignende steder man kan opbevare data.

Men at du bruger dem fremfor din egen singleton aendrer ikke rigtigt noget.
Avatar billede CodingJoe Nybegynder
29. november 2012 - 20:56 #6
Hmmm et par eksempler?
Avatar billede CodingJoe Nybegynder
29. november 2012 - 20:57 #7
Selvom det ikke ændrer min situation...
Avatar billede arne_v Ekspert
29. november 2012 - 21:05 #8
I selve web siden kan du bare bruge:

Application["foobar"]

Andre steder:

HttpContext.Current.Application["foobar"]
Avatar billede soes Nybegynder
29. november 2012 - 21:16 #9
Hvilket objekt er det du gerne vil have adgang til både i UI og data access m.v. ?
Avatar billede CodingJoe Nybegynder
29. november 2012 - 21:20 #10
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.
Avatar billede arne_v Ekspert
29. november 2012 - 21:25 #11
De fleste DI frameworks har en "singleton mode", hvor du naar du requester noget som implementerer IFoobar altid faar samme instans.

IFoobar fb = Foobar.Instance;

og

IFoobar fb = SomeDiThingy.Get(typeof(IFoobar)); // konfig som singleton

goer igen ikke den store forskel.
Avatar billede CodingJoe Nybegynder
29. november 2012 - 21:41 #12
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...

Er det en bedre måde?

Kom glad med kritik.
Avatar billede arne_v Ekspert
29. november 2012 - 22:04 #13
Hvis den singleton skal tilgaaes fra flere lag lyder utils som det rigtige sted at placere den.
Avatar billede CodingJoe Nybegynder
29. november 2012 - 22:10 #14
Hvorfor ikke blot lave en singleton læser i utils? Jeg sætter nemlig min singleton med værdier meget specifik for mit ui lag.
Avatar billede CodingJoe Nybegynder
29. november 2012 - 22:15 #15
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
Avatar billede arne_v Ekspert
30. november 2012 - 01:05 #16
Hvordan skulle de andre lag finde den singleton i utils?

Lave en ny singleton til at holde UI's singleton?

:-)
Avatar billede CodingJoe Nybegynder
30. november 2012 - 07:04 #17
Tanken har strejfet mig... Men tror det er en lidt overdrevet ide....eller hvad synes du? :)
Avatar billede arne_v Ekspert
30. november 2012 - 16:02 #18
Det var en joke.

Hvis man vil have en singleton til at holde en ref til en singleton, saa er ens design vist koert af sporet.
Avatar billede CodingJoe Nybegynder
30. november 2012 - 19:45 #19
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.

Har du et forslag til, hvad det bør være?
Avatar billede arne_v Ekspert
01. december 2012 - 01:31 #20
Det har at goere med at laese fra konfig filer.

Det kan vaere meget relevant.

Men loeser ikke global problemet (medmindre du vil laese samme konfig flere steder).
Avatar billede CodingJoe Nybegynder
01. december 2012 - 01:33 #21
Nej, det er mere til noget andet. Det globale problem løser jeg simpelthen ved at placere min singleton i min utils.
Avatar billede CodingJoe Nybegynder
01. december 2012 - 01:37 #22
....men hvordan vil du kode en settings klasse?

Når man add'er en settings i vs2010 opretter den
Avatar billede CodingJoe Nybegynder
01. december 2012 - 01:38 #23
en settings klasse, som så genne ui i vs2010 kan tilføjer elementer.

Hvis jeg nu har behov for at kode den, og sætte værdierne programmatisk...hvordan er det bedst at løse den på?
Avatar billede arne_v Ekspert
01. december 2012 - 02:24 #24
som standard gemmer man kun strings i config

det her er maaden man kan gemme en custom data klasse paa
Avatar billede arne_v Ekspert
01. december 2012 - 02:26 #25
Jeg husker vist forkert. De klasser er til noget lidt andet.
Avatar billede arne_v Ekspert
01. december 2012 - 02:27 #26
using System;
using System.Configuration;

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);
        }
    }
}
Avatar billede arne_v Ekspert
01. december 2012 - 02:27 #27
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="myconfig" type="E.MyConfig,MyConfig"/>
    </configSections>
    <myconfig foo="123" bar="ABC"/>
</configuration>
Avatar billede arne_v Ekspert
01. december 2012 - 02:28 #28
Var hvad jeg taenkte paa.
Avatar billede CodingJoe Nybegynder
01. december 2012 - 18:17 #29
Meget fint.

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.

Er der noget, jeg mangler.

Det er nok svært at tyde alt, det jeg mener her.
Avatar billede CodingJoe Nybegynder
01. december 2012 - 18:45 #30
Jeg kan se, min forklaring kan virke en anelse forvirrende.

Indlæsning af mine settings sker første gang. Fair nok.

...men anden gang, så bør settings være indlæst. Jeg tror, jeg skal lave en form for tjek på om mine settings er forskellig fra null eller ej...

jeg prøver lige et par ting...
Avatar billede CodingJoe Nybegynder
01. december 2012 - 19:20 #31
Damn I am good ;D

Fik det løst.
Avatar billede arne_v Ekspert
01. december 2012 - 21:29 #32
:-)
Avatar billede CodingJoe Nybegynder
03. december 2012 - 18:40 #33
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.
Avatar billede CodingJoe Nybegynder
03. december 2012 - 22:00 #34
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?
Avatar billede arne_v Ekspert
04. december 2012 - 02:18 #35
En single doer naar du applikation lukkes ned.

Teknisk set naar app domain lukkes ned. Men normalt er der kun et app domain i en applikation.
Avatar billede arne_v Ekspert
04. december 2012 - 02:19 #36
Hvis du gemmer current bruger i en singleton saa har du gjordt din applikation til en enkelt bruger app.

Ikke godt.

Hvis din singleton har en Dictionary<string,Bruger> kan du gemme flere brugere.
Avatar billede CodingJoe Nybegynder
04. december 2012 - 17:35 #37
Ok.

...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'.
Avatar billede arne_v Ekspert
04. december 2012 - 17:42 #38
Singleton er per process (per app domain i process).

Assembly split og GAC eller ej betyder ikke noget for det.
Avatar billede CodingJoe Nybegynder
04. december 2012 - 18:19 #39
ok, så jeg skal altså ikke være nervøs i mit tilfælde, selvom min utils assembly bliver brugt i en anden applikation? :)
Avatar billede arne_v Ekspert
04. december 2012 - 18:21 #40
korrekt
Avatar billede CodingJoe Nybegynder
11. januar 2013 - 23:14 #41
Send bare et svar ind, Arne.
Avatar billede arne_v Ekspert
12. januar 2013 - 00:05 #42
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester