7

He heredado un código que tiene una clase AuthenticationManager con todos los métodos estáticos.¿Cómo se refactorizan las clases estáticas para usar la inyección de dependencia?

Im introducción de DI y quería añadir un constructor que tomó una dependencia UserController

UserController _userController; 

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

Ahora estoy recibiendo el error de tiempo de compilación como se hace referencia a una variable no estática de un método estático. ¿Cuál sería su recomendación de mejores prácticas para que esto funcione con los cambios mínimos de esta clase y el código de llamada?

Estamos utilizando el SimpleServiceLocator como el contenedor IOC.

+0

¿No sería momento de actualizar a [Inyector simple] (http://simpleinjector.codeplex.com)? Dejé de desarrollar el Localizador de servicios simples. – Steven

+0

Gracias por la sugerencia: ¡no sabía que existía el inyector simple! ¿Simple Injector proporciona una funcionalidad adicional que responde a mi pregunta o simplemente es algo bueno que hacer? –

+0

No responde a su pregunta, pero Simple Injector es más rápido, más limpio y tiene una compatibilidad mucho mejor para agregar extensiones (la mayoría de los escenarios avanzados se describen aquí [http://simpleinjector.codeplex.com/wikipage?title] = Escenarios avanzados & referenceTitle = Documentación) no son posibles de implementar con SSL). Puede leer sobre las principales diferencias SI y SSL [aquí] (http://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=87). – Steven

Respuesta

9

Bueno, depende de la frecuencia con que se use la clase en todo el código. Es probable que desee crear una interfaz IAuthenticationManager que incluya métodos que coincidan con los métodos estáticos que desea reemplazar con los métodos de instancia. Luego, podría crear una clase AuthenticationManager que implemente la interfaz y acepte la dependencia UserController a través de su constructor.

Debería reemplazar todos los métodos de llamada de los métodos estáticos. Probablemente quiera inyectar un IAuthenticationManager en las clases a través de un constructor o una propiedad. Si es necesario, también puede pasar un IAuthenticationManager a los métodos (en los sitios de llamada) como parámetro.

Lamentablemente, la sustitución de métodos estáticos requiere bastante refactorización. Sin embargo, vale la pena el esfuerzo. Abre la puerta para pruebas unitarias.

Tenga en cuenta que siempre puede refactorizar un método a la vez extrayendo una interfaz para uno de los métodos estáticos. Haga cada método de uno en uno para realizar un acercamiento gradual a su refactorización (en otras palabras, cada método obtiene su propia interfaz).

Recomendaría echarle un vistazo a este libro si puede: Working Effectively With Legacy Code. Gran libro que cubre todo tipo de situaciones como esta.

Cuestiones relacionadas