Hva er en anstendig måte å injisere en avhengighet til en singleton klasse?

stemmer
5

Jeg har en singel som er avhengig av en annen klasse så jeg ønsker å injisere denne avhengigheten for å gjøre det unit-testbar. Siden det er ingen måte å bruke konstruktøren injeksjon på singleton jeg tror jeg skal bruke setter injcetion i stedet, men jeg egentlig ikke liker det fordi på et tidspunkt noen (sannsynligvis meg selv) vil glemme å ringe setter. Du kan selvfølgelig injisere avhengige objekter til singleton er getInstance metoden, men dette er ganske stygg også. Er det noen bedre måter å løse dette (ikke ved hjelp av verktøy som IOC containere)?

public class Singleton {
    private ISomeDependency _dependency;
    private static final Singleton INSTANCE = new Singleton();
    private Singleton() {
    }
    public static Singleton getInstance() {
       return INSTANCE;
    }
    ...
}
Publisert på 26/05/2011 klokken 07:37
kilden bruker
På andre språk...                            


2 svar

stemmer
3

The Singleton design mønsteret er en stor anti-mønster, fordi det er ingen måte å injisere avhengigheter i en enkelt. Dette betyr imidlertid ikke at det er ingen måte å ha en enkelt forekomst i løpet av levetiden til programmet, men du bør ikke bruke Singleton design mønsteret for dette. Spesielt når du bruker avhengighet injeksjon, er det ingen grunn til å bruke dette design mønster.

Bare injisere en forekomst av denne type som konstruktør i typer som er avhengig av det, og du er ferdig. Dette gir deg mulighet til å bygge opp objektet grafen øverst i programmet og kontrollere livsstil der og injisere avhengigheter i dette tilfellet.

Utformingen av den klassen skulle akkurat som alle andre klasse:

public class SomeService : ISomeService 
{
    private ISomeDependency _dependency;

    public ISomeService(ISomeDependency dependency)
    {
        _dependency = dependency;
    }

    // ISomeService members here
}

En avhengighet injeksjon rammeverk vil tillate deg å definere den livsstilen av enhver type veldig enkelt. For enkle applikasjoner, kan du imidlertid fortsatt gjøre dette for hånd.

Svarte 26/05/2011 kl. 07:49
kilden bruker

stemmer
0

Du kan bruke en avhengighet injeksjon container (som Spring.Net , MS Unity , etc.) for å få konkret type avhengigheten.

public class Singleton {
private ISomeDependency _dependency = Container.Resolve<ISomeDependency>();
private static final Singleton INSTANCE = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
   return INSTANCE;
}
...
}

Nå har du kontroll utenfor enkelt.

Svarte 26/05/2011 kl. 08:18
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more