Avatar billede CodingJoe Nybegynder
28. oktober 2012 - 22:05 Der er 5 kommentarer og
1 løsning

Spørgsmål om singleton

Jeg har tidligere lavet en klasse, som jeg kun vil have een instans af. Jeg har derfor benyttet mig af singleton pattern til dette formål.

Mit spørgsmål er, hvis jeg har en klasse, der er lavet som en singleton, hvis jeg bruger nedarvning, vil den nedarvede klasse ligeledes kun være een instans af?

public class MinSingleton : MinAndenKlasse
{
...
}

Jeg satser på 'MinAndenKlasse', der blot indholder nogle faste værdier (dvs. get properties med ting jeg henter fra min konfiguration) også kun er EN instans af.

Er det korrekt?

Eller: er der en måde at unitteste at MinSingleton klasse, kun er en instans?
Avatar billede arne_v Ekspert
28. oktober 2012 - 22:24 #1
du har fundet nogle af de steder hvor singleton begynder at give problemer !

:-)

public class X : Y

giver ingen problemer hvis Y er en normal klasse og X er en singleton.

Men Y som singleton duer ikke.

Med hensyn til unit tests skal du finde en workaround.

Et par oplagte muligheder er:

1) singleton laeser fra en konfig fil og du har en konfig fil til unit test og en anden til rigtig brug

2) singleton delegater til en instans af en anden klasse og denne skiftes saa mellem unit test og rigtig brug
Avatar billede CodingJoe Nybegynder
28. oktober 2012 - 23:14 #2
Lækkert input. MinAndenKlasse er en almindelig klasse...dog er den en abstract, håber det ikke er et problem.
Mht. Unit test så prøver jeg lige dine forslag, og vender tilbage med points. Smid et svar ind, så sender jeg point retur :) når jeg har afprøvet mine Unit tests.
Avatar billede arne_v Ekspert
28. oktober 2012 - 23:18 #3
Det er naermest en fordel at super klassen er abstrakt.
Avatar billede arne_v Ekspert
28. oktober 2012 - 23:18 #4
og svar
Avatar billede CodingJoe Nybegynder
28. oktober 2012 - 23:18 #5
Kan du give et eksempel på delegate delen på en singleton unittest...blot til inspiration.
Avatar billede arne_v Ekspert
28. oktober 2012 - 23:58 #6
public class MySingleton
{
    private static MySingleton _instance;
    private static object mylock = new object();
    private IRealThing real;
    private MySingleton()
    {
          real = SomeFactoryThatAreDifferentInUnitTestAndRealRuns.Get<IRealThing>();
    }
    public static MySingleton Instance
    {
          get
          {
                lock(mylock)
                {
                    if(_instance == null) _instance = new MySingleton();
                    return _instance;
                }
          }
    }
    public void SomeThing()
    {
          real.SomeThing();
    }
    public int SomeOther()
    {
          return real.SomeOther();
    }
}
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