2012-02-08 6 views
5

He creado un pequeño objeto estático para guardar tipos genéricos en Almacenamiento aislado en WP7. Esto funciona de maravilla para proyectos más antiguos, pero algunos de los proyectos nuevos usan DI para administrar la configuración. Soy un fan de DI porque significa que puedo cambiar la configuración en un solo lugar y filtrarla a todas las dependencias.¿Hay un contenedor de instancias alrededor de una clase estática con el propósito de DI y anti patrón?

Mi idea era crear un espacio de nombres llamado Injection y envolver este objeto en una instancia con una interfaz para poder inyectarlo. También me permitiría cambiar el controlador de almacenamiento por uno que requiera una implementación más específica.

¿Es esta práctica común o se trata de un patrón anti?

Como nota, quiero mantener la opción estática ya que no todo el mundo necesita o puede usar DI. Simplemente estoy tratando de habilitar ambos con la menor cantidad de duplicaciones.

+1

Uso el mismo enfoque para encapsular llamadas a 'Archivo' u otras clases/métodos estáticos. Entonces: No, no considero que sea un antipatrón. –

Respuesta

8

Ve esto todo el tiempo. Principalmente es para trabajar con el código heredado que ya está estático o sellado o no implementa ninguna interfaz. Mientras que una clase base en lugar de una interfaz, HttpContextBase es el ejemplo más destacado que se me ocurre.

Como quiera mantener la opción estática, esa es básicamente la situación en la que se encuentra actualmente, así que adelante y hágalo. Sin embargo, no crearía un espacio de nombre Injection, ya que ese nombre dice más sobre la mecánica que el papel que desempeña el objeto.

No escribe exactamente cómo la clase es estática, pero asumo que estamos hablando de una clase estática con métodos estáticos.

Una solución un poco más elegante (si se puede cambiar la clase un poco) es convertir la clase estática en un Singleton. Entonces podría ser estática e implementar la interfaz al mismo tiempo:

public class Foo : IFoo 
{ 
    private readonly static Foo instance = new Foo(); 

    private Foo() { } 

    public static Foo Instance 
    { 
     get { return Foo.instance; } 
    } 

    // IFoo member: 
    public void InterfaceFoo() 
    { 
     Foo.LegacyFoo(); 
    } 

    public static void LegacyFoo() 
    { 
     // Implementation goes here... 
    } 
} 

Creo que la única refactorización necesario para llegar a una solución de este tipo es hacer que la propia clase concreta y que sea implementa la interfaz como un Singleton.

clientes viejos todavía podían acceder a sus métodos invocando Foo.LegacyFoo();

+1

Quizás una propiedad estática llamada _Current_ sea mejor que un método. –

+0

Gracias, la biblioteca es nueva, por lo que no tiene requisitos previos como tal. La razón para hacer que el objeto sea estático era para facilitar su uso a las personas que no deseaban/querían inyección de dependencia. Un singleton parece ser una propuesta más atractiva, ya que resuelve otro problema relacionado con las clases estáticas que no pueden usar interfaces. – deanvmc

+1

@ Matías Fidemraizer: Hay una propiedad estática llamada 'Instance', que es estructuralmente la misma. No creo que la palabra "Actual" sea buena aquí, ya que implica que el Singleton podría cambiar a medida que pase el tiempo. –

1

En mi opinión, que dejaría contenedor de inyección de dependencias decidir si es transitoria o Singleton - No sé qué marco se está utilizando ya, pero la mayoría de ellos debería controlar el ciclo de vida de las dependencias -.

Y las aplicaciones de inyección de pre-dependencia pueden mantener una instancia estática de este objeto como parte de una administración de estado de toda la aplicación.

Cuestiones relacionadas