Ja, du har ret i at jeg kan bruge StackFrame, men det virker ikke så elegant og genbrugbart.
Internal constructor er en workaround som dog ikke løser problemet. Jeg er interesseret i en mere deklarativ løsning som skitseret. Har overvejet om CodeAccessSecurity kan bruges, men kan ikke umiddelbart løse det på den måde.
Men tror ikke det som sådan umildbart kan laves, og du vil næsten alligevel altid kunne oprette en instance af det via reflection, så tror ikke du får nogen pæn løsning.
Må man spørge hvad grunden er til at du ikke vil lade andre oprette en instance af den?
Det er korrekt at reflection kan hacke sig igennem, men det vil jeg ikke forhindre. Hvis man bruger reflection så ved kan at man KAN bryde de oprindelige intensioner.
Idéen med mit spørgsmål er at jeg har en klasse som jeg vil være sikker på kun kan instantieres via en factory. Således har jeg styr på flowet og sikrer at andre udviklere ikke tilgår klassen direkte (i tilfælde af at der en dag skal skiftes implementering eller ændres i factory logikken). Jeg synes selv at en deklarativ løsning er let at læse og let at bruge - men ved ikke hvordan jeg implementerer den.
Det er muligt at jeg ikke kan få en compiletime fejl, men så vil min unittest opdage en runtime exception.
Det giver fint mening, men hvis dine klasse alligevel er så tæt koblet, så synes jeg det er en fin måde at lave en subclass. Det virker nemlig ikke til at du bruger IOC eller andre ting.
Men jeg har ikke lige umildbart en elegant løsning på dit problem, men mon ikke der kommer en senere på dagen, som eventuelt har en ide til det.
Jeg havde for et par år siden samme problem. At opdrage ulydige udviklere er svært. Men altså det blev noget med, at lade runtime'n kalde en factory hver eneste gang nogen mente de skulle lave en "x = new y()". Det lyder simpelt, men det blev lidt noget juks - men det virkede på daværende tidspunkt.
Denne tråd diskuterer nogenlunde den samme problematik som du prøver at løse. Der er ingen silver bullet solution, men et par interesse løsningsforslag.
Tak for kommentarer. Jeg kom ikke nærmere mit mål, men tak for input. Fair nok hvis det teknisk set ikke kan lade sig gøre. Hvordan er kotume med points på eksperten?
Ja, det er præcis mit formål. Ikke deklarativt som jeg håbede på, men det er sådan noget jeg skal bruge. Hmm, fin idé at tage initializoren med som argument...
Jeg er med på at man kan diskutere mange ting om kobling ved dette spørgsmål, men det er slet ikke formålet.
Intet, men det er i hvert fald garanteret at der har været en initialiseret Factory med i spil.
Desuden er det vist ikke væsentligt forskelligt fra denne konstruktion:
class B { public B() { Factory f = new Factory(); A a = f.CreateA(); } }
Jeg ved ikke lige hvad der er pointen med at man ønsker at sikre at alle A-instanser er genereret af en Factory, så jeg kan ikke sige om det er godt nok eller ej.
Hvis din Factory er lavet via Singleton pattern, har du så netop løst det ved at kræve den i konstruktøren til A.
Derudover kunne du også løse det ved simpelthen at generere klasserne udelukkende vha. reflection fra din factory og gør alle konstruktører private?
Synes godt om
Ny brugerNybegynder
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.