2010-03-15 6 views
6

Según tengo entendido, todo el código de implementación de contratos tiene que estar en una sola clase, que puede llegar a ser muy grande, obviamente. ¿Cómo evito esto? Realmente prefiero tener unas pocas clases pequeñas haciendo una parte de la comunicación con los clientes que una única clase gigantesca.¿Cómo puedo evitar grandes clases de comunicación en WCF?

La única idea que se me ocurre es usar múltiples interfaces implementadas por una sola clase dividida por partial, pero no creo que esto realmente resuelva el problema.

Respuesta

2

Primero, si su contrato es grande, ¿pueden ser refactorizados en contratos de servicio más específicos?

La clase de implementación del contrato se puede implementar como método de punto de entrada. Siempre puede modelar la implementación y definir la abstracción apropiada y hacer que su clase de implementación de contrato de servicio llame a esa implementación interna.

+0

+1 exactamente - no tiene un solo contrato de servicio über humilde - divídalo en trozos manejables. ¡Entonces la implementación del servicio tampoco será demasiado grande! –

+0

Los contratos múltiples significan conexiones múltiples, ¿verdad? Prefiero evitar eso. – mafu

+0

Cada uno tendrá que estar alojado en una dirección diferente, por lo tanto, requieren una conexión proxy diferente si eso es lo que quieres decir. Si intenta evitar esto, entonces refactorice su implementación interna para usar patrones de herencia o de fachada como se sugiere en otras respuestas. –

1

Esa 'clase individual' generalmente es una fachada, solo un front-end de comunicación.
Por lo tanto, debe no implementar toda su lógica en el Implementador de servicios.

Y sus interfaces deben ser lo más pequeñas posible (haga 1 cosa bien). Pero si es necesario, su fachada puede invocar múltiples clases.

+0

Sí, por supuesto, pero la clase todavía es bastante grande, así que me gustaría dividirla de alguna manera ... – mafu

+0

Eso significa que tiene un 'bastante interfaz grande y tal vez un problema de diseño. –

3

Es posible que desee utilizar Inheritance, dependiendo de la estructura del código yoru. Por lo general, puedes dividir todo el código en piezas más pequeñas, ayudantes, sub-rutinas, etc.

Es como con cualquier otro desarrollo de API, no quieres/no necesitas todo en el mismo lugar en el mismo paquete.

1

Tenemos aproximadamente 60 archivos parciales llamados "BeamServer.cs", cada uno en una subcarpeta que corresponde al propósito de las funciones en ese archivo. Cualquier clase de ayuda (u otros archivos auxiliares) que sean para la misma área de nuestro programa reside en esa carpeta también.

Su "clase única" representa su "necesidad de una empresa". Encontramos un buen beneficio adicional en el sentido de que si uno de los miembros de nuestro equipo está trabajando en la parte de "contabilidad" de BEAM (nuestro software), entonces verificaría el archivo "Accounting \ BeamServer.cs" y nada del resto del equipo se vería afectado.

EDIT: Además, la clase debe única contener las firmas de los métodos (y funciones de contenedor que simplemente llaman base.Channel.DoSomething() ... cualquier estructura de datos serían, por supuesto sus propios archivos de clase (como "Person.cs" o " Employee.cs "o lo que sea).

+0

Seguí adelante y probé clases parciales, pero lamentablemente, VS08 no lo admite bien, así que dejé de lado esta idea. :( – mafu

2

Si pudiera cambiar su código fundamentalmente, podría exponer solo un punto final que funcione con los mensajes de solicitud/respuesta. De esta manera podría haber un solo punto final y una única definición de servicio que toma un mensaje de solicitud (posiblemente derivado) y devuelve un mensaje de respuesta. Su interfaz en el servicio sería simplemente un único método y en la implementación del lado del servidor enrutaría ese objeto de solicitud al servicio real i Implementación (posiblemente determinada por una fábrica) posiblemente usando metadatos en el mensaje de solicitud (o incluso 'nombre de tipo') para definir a qué servicio se está llamando.

lo tanto, su interfaz de servicio final sería simplemente tener un método como este:

public interface IServiceRequestor 
{ 
    Response ProcessRequest(Request request); 
} 

Esto le permite manejar un número posiblemente ilimitado de servicios expuestos sin necesidad de saber lo que van a estar en la compilación/hora dev , y también evitar una proliferación de métodos de servicio que definen las llamadas de servicio disponibles

+0

Eso es bastante radical, pero la idea general de combinar métodos similares es buena. – mafu

Cuestiones relacionadas