Avatar billede driis Nybegynder
06. marts 2006 - 09:53 Der er 5 kommentarer og
2 løsninger

Generisk singleton / friend i C#

Jeg ønsker at skrive en generisk singleton klasse, inspireret af en lignende implementation, jeg før har brugt i C++. Jeg er imidlertid løbet ind i et problem: Hvordan sikrer jeg at kun én instans af klassen kan oprettes, samtidig med at Singleton klassen kan oprette en instans af klassen ?

Hvis jeg erklærer:
public class Singleton<T> where T : class, new() {}

Så har jeg klasse, der kan instantiere typen T, men kun hvis den har en public constructor. Hvis den har en public constructor, kan man jo instantiere flere objekter af klassen, hvilket jeg ikke ønsker. Illustreret i kode ser det sådan ud:
public class MyClass : Singleton<MyClass>
{
  // private MyClass() { ... } // Compile error
  public MyClass() {...} // OK
}

Hvordan løser jeg det problem ? Kan det passe at C# mangler en "friend class" konstruktion eller lignende, der kan løse dette ?
Avatar billede dr_chaos Nybegynder
06. marts 2006 - 16:17 #1
Når jeg bruger singleton pattern benytter jeg:
public sealed class Bruger
{
    private static readonly Bruger instance = new Bruger();
    private Bruger()
    {
    }
    //returnere en instans af bruger klassen
    public static Bruger GetBruger()
    {
        return instance;
    }
}
Så kan man benytte
Bruger b = Bruger.GetBruger();
Eller
Bruger.GetBruger().Funktionsnavn
Avatar billede arne_v Ekspert
07. marts 2006 - 04:55 #2
lidt googling antyder at en internal access modifier paa constructor og en
assembly: InternalsVisibleTo til at give singleton wrapperen adgang er
en mulighed
Avatar billede driis Nybegynder
07. marts 2006 - 21:59 #3
arne >> Har du et link til et eksempel på internal fremgangsmåden ?

dr_chaos >> Jeg er klar over fremgangsmåden, jeg ville blot wrappe den funktionalitet, du skitserer, i en generisk singleton implementation.

Jeg synes ikke der lader til at være en ordentlig, pæn, mulighed for dette - Med mindre jeg finder internal constructor løsningen brugbar.

Hvis jeg tillader en public constructor, brydes noget af idéen med mønstret. Dog vil det afhængigt af anvendelsen ikke altid være mission-critical. Jeg kan også bide i det sure æble og implementere mønstret i alle klasser, jeg ønsker skal være Singleton (implementationen vil være lidt længere end dr_chaos' eksempel, da den både skal være lazy-loaded og thread safe).

Diskussionen bliver en smule teoretisk, da jeg i det projekt jeg arbejder på kun har brug for nogle få Singleton klasser. Men af ren interesse ser jeg meget gerne jeres og andre eksperters kommentarer på de mulige løsninger, og hvad i ville, eller har, valgt.

I må begge gerne lægge et svar så jeg kan lukke spørgsmålet på et senere tidspunkt.
Avatar billede arne_v Ekspert
08. marts 2006 - 03:06 #4
Avatar billede arne_v Ekspert
08. marts 2006 - 03:07 #5
og svar
Avatar billede driis Nybegynder
08. marts 2006 - 18:35 #6
Du behøver ikke at lave et eksempel, jeg har vist styr på mulighederne nu.
Jeg afventer blot lige om dr_chaos vil lægge et svar.
Avatar billede dr_chaos Nybegynder
08. marts 2006 - 18:38 #7
svar :)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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