2011-05-04 9 views
5

Tengo un servicio WCF que tiene algunas responsabilidades diferentes, pero proporciona un punto de entrada para cualquier persona que interactúe con mi código. Para hacerlo simple, digamos que hay 2 métodosIOC Container - WCF Service - ¿Debería instanciar todas las dependencias mediante el constructor?

private IMethodAHelper _methodA; 
    private IMethodBHelper _methodB; 

    public MyService(IMethodAHelper methodA, IMethodBHelper methodB) 
    { 
     _methodA = methodA; 
     _methodB = methodB; 
    } 

    public void MethodA() { 
     _methodA.CallThis(); 
    } 

    public void MethodB() { 
     _methodB.CallThis(); 
    } 

Debido a que los consumidores solo llamar al servicio por una razón, MethodA o MethodB, es un problema que el contenedor COI será innecesariamente girar todas las dependencias? Quiero proporcionar un solo punto de entrada, por lo que no quiero dividir el servicio, pero parece un poco inútil duplicar todas las dependencias cuando cada consumidor del servicio solo necesite un subconjunto.

Otra forma en que estaba pensando en hacer esto sería algo así como

public void MethodA() { 
     var methodA = ObjectFactory.GetInstance<IMethodAHelper>(); 
     methodA.CallThis(); 
    } 

Esto permite que cada "camino" para que aparezcan las dependencias que necesita, sin embargo, que hace que sea mucho más difícil de escribir pruebas unitarias. ¿Alguien tiene alguna sugerencia? ¿Qué tan grande es el problema para activar todas las dependencias? Después de este primer punto de entrada al servicio, tiene sentido inyectar las dependencias a través del constructor, pero en este primer punto de entrada, ¿cuál es el enfoque recomendado?

Respuesta

2

Como dice Mark, no debe preocuparse por crear dependencias que no se utilizan a menos que tenga algún prof real (tiempos del perfilador) que son caros de crear. Si tiene componentes costosos para crear, puede usar un contenedor que admita la inyección diferida, como AutoFac. De esta forma, puede inyectarse Lazy, que se construirá solo en el primer uso.

1

No conozco los detalles de lo que está haciendo, pero puede tener más sentido dividirlos en servicios separados.

2

Una regla general para la inyección de dependencias es que todas las dependencias (requeridas) que una clase necesita para funcionar correctamente deben inyectarse a través de la inyección del constructor.

Todas las dependencias (opcionales) se deben inyectar a través de la inyección de propiedades. Opcional en este caso es cuando la clase proporciona una implementación predeterminada de una interfaz y desea cambiar la implementación de la interfaz en tiempo de ejecución o configuración.

De todos modos estoy de acuerdo con la respuesta de Mark Seemann.

Cuestiones relacionadas