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.
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... :(
Den forstod jeg ikke.
Kan du forklare lidt mere - gerne med et par kode fragmenter.
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.
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?
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.
Hvis MinKlasse er i X.dll saa skal Navn returnere X.dll og hverken A.dll eller B.dll!
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
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
Hmmm tror jeg har gjort noget forkert...jeg finder lige ud af det...
Nej, koden ser rigtig nok ud.
Det virker faktisk fint...jeg får det rigtige navn.
problemet ligger mellem:
Assembly.GetExecutingAssembly().GetName().Name;
og
Assembly.GetCallingAssembly().GetName().Name;
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!!!!
Arne, jeg skylder dig point. Smid bare et svar ind.