7

Ho ereditato del codice che ha una classe AuthenticationManager con tutti i metodi statici.In che modo si rifattano le classi statiche per utilizzare l'iniezione delle dipendenze?

Im introducendo DI e voluto aggiungere un costruttore che ha preso una dipendenza UserController

UserController _userController; 

public AuthenticationManager(UserController userCont) 
{ 
    _userController = userCont; 
} 

Ora Im ottenendo l'errore di tempo di compilazione come una variabile non statico si fa riferimento da un metodo statico. Quale sarebbe la tua migliore raccomandazione pratica per farlo funzionare con le minime modifiche a questa classe e al codice chiamante?

Stiamo utilizzando SimpleServiceLocator come contenitore IOC.

+0

Non sarebbe il momento di eseguire l'aggiornamento a [Simple Injector] (http://simpleinjector.codeplex.com)? Ho smesso di sviluppare Simple Service Locator. – Steven

+0

Grazie per il suggerimento - Non ero a conoscenza dell'esistenza di Simple Injector! Simple Injector offre funzionalità extra che rispondono alla mia domanda o è solo una buona cosa da fare? –

+0

Non risponde alla tua domanda, ma il Simple Injector è più veloce, più pulito e ha un supporto molto migliore per l'aggiunta di estensioni (la maggior parte degli scenari avanzati descritti [qui] (http://simpleinjector.codeplex.com/wikipage?title = Advanced-scenarios e referringTitle = Documentazione) non è possibile implementare con SSL). Puoi leggere le differenze di base SI un SSL [qui] (http://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=87). – Steven

risposta

9

Beh, dipende da quanto spesso la classe viene utilizzata in tutto il codice. Probabilmente vorrai creare un'interfaccia IAuthenticationManager che includa metodi che corrispondono ai metodi statici che desideri sostituire con i metodi di istanza. Quindi è possibile creare una classe AuthenticationManager che implementa l'interfaccia e accetta la dipendenza tramite il suo costruttore.

Sarà quindi necessario sostituire tutti i metodi di istanza dei siti di chiamata del metodo. Probabilmente vorrai iniettare uno IAuthenticationManager nelle classi tramite un costruttore o una proprietà. Se necessario, è anche possibile passare uno IAuthenticationManager ai metodi (nei siti di chiamata) come parametro.

Purtroppo la sostituzione dei metodi statici richiede un po 'di refactoring. Vale la pena lo sforzo però. Apre la porta per i test unitari.

Ricordare che è sempre possibile eseguire il refactoring di un metodo alla volta estraendo un'interfaccia per uno dei metodi statici. Esegui ciascun metodo uno alla volta per adottare un approccio graduale al tuo refactoring (in altre parole, ogni metodo ottiene la propria interfaccia).

Suggerirei di dare un'occhiata a questo libro se è possibile: Working Effectively With Legacy Code. Un grande libro che copre ogni tipo di situazione come questa.