10. oktober 2012 - 00:22Der er
35 kommentarer og 1 løsning
Holde på et objekt 'state' andre steder i applikationen
Jeg forsøger at gøre værdierne i mit objekt tilgængelig i andre dele af min applikation. Jeg kan ikke bruge sessions værdier eller cookies, da jeg opererer nede noget rent c#. Jeg vil heller ikke persistere værdierne i en fil eller andet.
Jeg vil blot gerne fx. læse en værdi sat fra et andet sted i min applikation.
fx. en klasse med get og set muligheder.
Jeg setter en værdi i starten af min applikation....længere fremme i fx en hel anden klasse og metode, vil jeg gerne tilgå den værdi tidligere sat. Er der nogen, der kan give mig en god ide til det?
Jeg vil helst undgå nedarvning, da det jo betyder alle mine klasser skal implementere min hovedklasse, hvis min get og set ligger i denne...
Forslag? Jeg giver sprøde points til det bedste og simpleste... :)
Med kunstig intelligens skaber HP’s nye OmniBook X 14 en unik og skræddersyet brugeroplevelse målrettet dem, der ønsker høj ydeevne og intelligente funktioner
Men jeg vil mene du er på vej i den forkerte retning hvis du tilgår data på den måde. Der kan være grunde til at bruge singleton og gøre som du er ved ... men de er få.
Singleton har faaet et daarligt ry de sidste 6-8 aar og det kan da ogsaa give problemer, men det behoever ikke vaere saa slemt. Bl.a. hjaelper det gevaldigt hvis det er readonly properties.
AT behovet er der illsutreres af at de fleste DI framworks kommer med support for "singleton object", hvor alle faar samme objekt.
Jeg har faktisk både tænkt på singleton pattern og måske Strategy pattern, men tror ikke strategy vil hjælpe.
Dog tænkte jeg at singleton var lidt omstændigt for noget, der lyder ret simpelt.
Jeg skal bare sikre mig at værdien af det jeg vil holde, kan klare flere tråde. Kommer brugen af min applikation fra en anden vej, så skal der være to 'sessioner', hvor to forskellige værdier holdes på henholdsvis, hver deres session.
Hvad siger i til denne meget simple singleton? Den skal være threadsafe...jeg er ikke helt sikker på hvad object Lock bruges til...det er nok for at opretholde en thread safety:
public static class Singleton { static Vaerdi _instance; static readonly object Lock = new object();
public static Vaerdi HentMinVaerdi { get { lock (Lock) { if (instance == null) { instance = new Vaerdi(); } return instance; } } }
Din naming synes jeg er mindre heldig ... hold dig til engelsk, det gør alle glade der skal se din kode fremover.
Specielt fordi vi på dansk netop har ÆØÅ.
HentMinVaerdi burde hedde MinVaerdi ... hence du du kalder den som:
var vaerdi = Singleton.MinvVaerdi;
er det jo implicit angivet du vil hente den.
ThreadSafe er overstående ikke ... men du burde nemt kunne google en løsning. Problemet er at hvis Vaerdi klassen har properties, kan de jo ændres af alle dem som henter klassen.
class Program { static void Main(string[] args) { var a = MySingleton.Instance; a.Vaerdi = "Hallo"; } }
Det kan være jeg skal have det skåret ud i pap, men ovenstående er nok ikke måden, jeg skal sætte min værdi på? Den siger ihvertfald, der ikke er nogen setter på min property. :(
Nej, det kan jeg ikke. Jeg kan desværre ikke læse fra en config fil inde i min contructor...det er en værdi, der faktisk bestemmer, hvilken del af min configuration, jeg skal bruge.
Det blev ovenstående...men så kan man vel til enhver tid overskrive den vaerdi, jeg allerede har haft skrevet. Det er vel også ok, da det er noget jeg / en udvikler explicit vælger at gøre...
Hmmmm jeg tvivler lidt på om det virkelig er en singleton, jeg har brug for. Mit indlæg #5, gav faktisk også det jeg havde brug for. En statisk måde at sætte og læse en variabel på. Tænker på at skrælle lock delen væk og bruge resten.
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.