Problemet er, at hvis f.eks. disse to klasser bruger hinanden, ryger jeg ind i et "create-loop", hvor den ene klasse opretter den anden, som så opretter den ene (for at få adgang til dens funktioner m.m.) og så forfra igen.
Er der en smart måde jeg kan snige mig uden om dette uden at rette alt for meget i strukturen, eller er det bare en designmæssig bommert?
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
En løsning kunne være at lave visse funktioner statiske, men da jeg bruger nogle andre oprettede objekter "globalt" i hele klassen, ville det nok heller ikke virke...
Dem fejler stadig, selvom jeg har implementeret din metode, dog på en meget mindre brutal måde end før, hvor hele serveren crashede og webapplikationen lukkede - for good.
Men stadig: Exception of type System.StackOverflowException was thrown. Kigger videre for at se hvad der kan være galt...
Lyder lovende - men når desværre ikke at implementere det i dag, så må vente med at prøve det af til i morgen - men smider lige en konklusion i morgen :)
og jeg skal vist have rettet min Singleton artikel her på E - jeg vil ikke tilføje den mulighed med nested class den er for speciel, men jeg påstår at double locking virker i .NET
Problemet med din StackOverflowException tyder på at du har en situation - groft simplificeret - hvor en metode M1 i klassen Class1, som kalder en metode M2 i klassen Class2, som så for sin del kalder M1 igen:
namespace PocEksperten { class App { [STAThread] static void Main(string[] args) { Class1 MC1 = new Class1(); MC1.M1(); } }
public class Class1 { private Class2 C2;
public Class1() { C2 = new Class2(this); }
public Class1(Class2 class2) { C2 = class2; }
public void M1() { C2.M2(); } }
public class Class2 { private Class1 C1;
public Class2() { C1 = new Class1(this); }
public Class2(Class1 class1) { C1 = class1; }
public void M2() { C1.M1(); } } }
Måske kan der være flere led i kæden, eller også er det lidt mere kompliceret end som da, men StackOverflowException plejer som regel at betyde at man har en uendelig kæde af metode-kald.
Hvis det er det som er din fejl, så hjælper det desværre intet at gøre klasserne til Singletons. Der er kun et at gøre og det er at finde kæden og sikre sig at den bliver brudt.
Nu har jeg leget lidt med det, og må sige det har virkelig givet store hastighed-forøgelser i mine webapplikationer, men jeg oplever nogle problemer når jeg rammer mit "klasse-loop".
Det der sker, er bare at anden gang loop'et bliver ramt, bliver instancen ikke hentet fra den andet singleton-klasse - der bliver bare returneret en null-værdi, hvilket så fejler herefter.
Jeg benytter 4. metode i ovenstående artikel, og råt udskåret ser det sådan ud:
-------------------------------------- public sealed class HouseFunctions { ... private CalendarFunctions calendarFunctions;
private static readonly HouseFunctions instance = new HouseFunctions();
public static HouseFunctions Instance { get { return instance; } }
public HouseFunctions() { ... calendarFunctions = CalendarFunctions.Instance; ... }
static HouseFunctions() { }
.... } --------------------------------------
public sealed class CalendarFunctions { ... private Functions.HouseFunctions houseFunctions;
private static readonly CalendarFunctions instance = new CalendarFunctions();
public static CalendarFunctions Instance { get { return instance; } }
public CalendarFunctions() { houseFunctions = HouseFunctions.Instance; ... }
static CalendarFunctions() { }
... } --------------------------------------
Jeg har desuden været nød til at fjerne mine dispose-funktioner.
Nielle: Jeg ved hvad kæden er - to klasser som constructor hinanden i en uendelighed. Men er der ingen programmerbar måde ud af det, uden at skulle omstrukturere hele skidtet?
Dit eksempel 10/05-2005 10:33:45 fungerer nu ellers fint uden at styrte her hos mig.
Du siger at loopen skyldes at constructors kalder constructors; Og der tror jeg altså at du tager fejl:
Jeg har angivet én mulig metode til at undgå dette, 09/05-2005 13:37:07, og du har prøvet denne. Den hjalp da også på situationen - med det "men" at du efterfølgende fik en StackOverflowException i stedet.
Du har også prøvet en anden mulig metode, 10/05-2005 10:33:45, nemlig at bruge Singleton-patteren. Den fungerer også fint uden at gå i loop.
At du stadig får en StackOverflowException må altså skyldes at det er nogen af de *andre* metoder i dine to klasser som går i loop. Desværre kan jeg ikke sige noget mere konkret uden at se den rigtige kode.
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.