Avatar billede CodingJoe Nybegynder
29. oktober 2012 - 18:09 Der er 15 kommentarer

Problemer med min singleton

Så endelig efter at have lavet min singleton og finpudset den lidt, så rammer jeg en mur. Jeg havde regnet med, min singleton kunne holde på state på tværs af mine assemblies. Jeg har en applikation bestående af ca. 4 assemblies, og alle har referencer til den assembly, hvor min singleton befinder sig i. Dog ender jeg med at jeg ikke refererer til den samme instans, men at de 4 hver især laver deres egen instans af min singleton. Det var ikke planen :(

Tror min instans kun lever i den samme assembly, jeg har læst lidt på nettet og tilsyneladende skal jeg benytte mig af remoting. Dog er jeg bange for, at den vil volde mig problemer, da jeg sagtens kan have andre applikationer referere til min singleton assembly.

Hvad gør jeg her?

Jeg giver sprøde points til de(t) bedste svar :)
Avatar billede arne_v Ekspert
29. oktober 2012 - 18:19 #1
Din singleton vil kun eksistere i en kopi per app domain, hvilket i de fleste tilfaelde er per process.

Forskellige assemblies i samme app domain skal bruge samme kopi.
Avatar billede CodingJoe Nybegynder
29. oktober 2012 - 18:42 #2
Det mente jeg også, men jeg skriver fx. navnet på den første assembly, der første gang benytter sig af min singleton, efterfølgende skriver jeg navnet ud i en log. Benytter jeg mig af min singleton i fx. en dataadgangs assembly og skriver navnet ud, så er det navnet på min dataadgangs assembly og ikke den første... :(
Avatar billede arne_v Ekspert
29. oktober 2012 - 18:47 #3
Den forstod jeg ikke.

Kan du forklare lidt mere - gerne med et par kode fragmenter.
Avatar billede CodingJoe Nybegynder
29. oktober 2012 - 19:26 #4
I min Singleton nedarver jeg fra min klasse:

public sealed class MinSingleton : MinKlasse
{
        private static readonly object SyncRoot = new object();

        private static volatile MinSingleton instance;

        public static MinSingleton Instance
        {
            get
            {
                lock (SyncRoot)
                {
                    return instance ?? (instans = new MinSingleton());
                }
            }
        }
    }

------------------------------------

public abstract class MinKlasse {

public string Navn
{
    get
    {
      return Assembly.GetExecutingAssembly().GetName().Name;
    }
}
}

I min første logger gør jeg noget lignende:
MyLogger.Current.LogInfo(MinSingleton.Instans.Navn);

Et andet sted i en anden assembly gør jeg det samme:
MyLogger.Current.LogInfo(MinSingleton.Instans.Navn);

Har jeg misforstået noget? :(

Jeg får to forskellige navne. Jeg havde regnet med anden gang jeg loggede, ville navnet på den assembly fra første gang ville være bibeholdt.
Avatar billede arne_v Ekspert
29. oktober 2012 - 19:33 #5
Hvis MinSingleton og MinKlasse er i X.dll og de to kald er i A.dll og B.dll, saa boer den udskriver X.dll begge gange!

Har du faaet MinSingleton og MinKlasse bygget ind i A.dll og B.dll?
Avatar billede CodingJoe Nybegynder
29. oktober 2012 - 19:48 #6
De er i X.dll

og min A.dll benytter min singleton første gang...

i min B.dll forventer jeg navnet på A.dll, men det er det ikke :(

Både A.dll og B.dll har en reference til X.dll.
Avatar billede arne_v Ekspert
29. oktober 2012 - 19:55 #7
Hvis MinKlasse er i X.dll saa skal Navn returnere X.dll og hverken A.dll eller B.dll!
Avatar billede CodingJoe Nybegynder
29. oktober 2012 - 20:00 #8
Det gør den faktisk...my bad.

Det er faktisk også derfra jeg skriver ud i min log første gang...og i min (lad os bare kalde den) a.dll benytter jeg min singleton igen og får navnet på min x.dll
Avatar billede CodingJoe Nybegynder
29. oktober 2012 - 20:01 #9
Revidere:

Det gør den faktisk...my bad.

Det er faktisk også derfra jeg skriver ud i min log første gang...og i min (lad os bare kalde den) a.dll benytter jeg min singleton igen og får navnet på min A.DLL!

Det går lidt for hurtigt...med at skrive
Avatar billede CodingJoe Nybegynder
29. oktober 2012 - 20:25 #10
Hmmm tror jeg har gjort noget forkert...jeg finder lige ud af det...
Avatar billede CodingJoe Nybegynder
29. oktober 2012 - 20:38 #11
Nej, koden ser rigtig nok ud.
Avatar billede CodingJoe Nybegynder
29. oktober 2012 - 20:47 #12
Det virker faktisk fint...jeg får det rigtige navn.
Avatar billede CodingJoe Nybegynder
29. oktober 2012 - 20:50 #13
problemet ligger mellem:

Assembly.GetExecutingAssembly().GetName().Name;

og

Assembly.GetCallingAssembly().GetName().Name;
Avatar billede CodingJoe Nybegynder
29. oktober 2012 - 20:53 #14
og rækkefølgen mine unittests kører i...lol. Det er den første unittest, der faktisk bestemmer udfaldet af resten. He he he selvfølgelig...føler mig ret dum nu :S

The magic and curse of singleton!!!!
Avatar billede CodingJoe Nybegynder
11. januar 2013 - 23:16 #15
Arne, jeg skylder dig point. Smid bare et svar ind.
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
Kurser inden for grundlæggende programmering

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