Encapsulación de una referencia de servicio

Estoy creando un conjunto de aplicaciones de consola que necesitan hacer referencia a un servicio web. Tengo una biblioteca de clases que contiene gran parte de la funcionalidad compartida de estas aplicaciones, incluido el servicio web (que se ha agregado como referencia de servicio). Sé que la forma "correcta" de manejar esto es copiar el bloque de la biblioteca de clases app.config a cada aplicación de consola, pero eso causa dolores de cabeza de mantenimiento. También encontré la alternativa de usar un archivo app.config compartido, con una referencia a él desde la configuración de cada aplicación. Eso es mejor, pero aún así no es genial: todavía implica configurar manualmente cada nueva aplicación y requiere que me asegure de que el archivo de configuración compartido esté en un lugar al que todas las aplicaciones puedan acceder.

Lo que estoy buscando es una de tres cosas (en orden decreciente de satisfacción):

  1. Una forma de encapsular todo el servicio y todo lo necesario para acceder a él en la dll que se produce a partir de la biblioteca de clases.
  2. Una forma de copiar automáticamente la información de configuración relevante en el directorio de compilación de cada aplicación de consola (como un script posterior a la compilación).
  3. Una explicación de por qué ninguno de los dos anteriores es factible. (En cuyo caso iré con la configuración compartida)

¿Algún consejo?

preguntado el 16 de mayo de 11 a las 16:05

encapsulate the whole service ? -

Bastante. Las aplicaciones de la consola no necesitan ver que el servicio existe en absoluto. Solo necesitan usar las clases en la biblioteca para hacer lo suyo. El hecho de que parte de lo que sucede en esas clases involucre un servicio web es irrelevante para ellos y puede cambiar en una fecha posterior. -

Entonces se trata de crear una api y adaptarla al servicio. Habla mucho sobre los archivos de configuración en su pregunta, pero nunca mencione lo que está tratando de hacer con el servicio (por eso estaba preguntando;)) -

No estoy creando el servicio, estoy consumiendo uno externo. -

Cuando digo adaptarlo al servicio me refiero a consumir tu servicio. Estoy escribiendo algo ahora. -

2 Respuestas

Honesty 2 es trivial. Puede copiar fácilmente un archivo de configuración a un directorio de compilación. Una simple búsqueda en Google puede brindarle todo lo que necesita.

Para la Parte 1, tiene opciones aquí, sugeriría simplemente definir la API para su servicio en un formulario de interfaz. Luego, usando DI para conectar la "implementación" a través de un dll. Se hace todo el tiempo usando el Patrón de adaptador, y luego usando algo como La Unidad, para la implementación en tiempo de ejecución.

SEUDO:

interface IMyServiceAdaptor {
   void SomeMethod(params );
   void SomeMethod2(params );
}

public class ServiceAdaptor : IMyServiceAdaptor{
    #psudo code
    ServiceProxyClient client  { get;set;}

    public void SomeMethod(parms){
       var convertedParams = Convert(parms);
       return client.SomeMethod(convertedParams );
   }
   ...etc

}

public class MyClient {
  [Dependancy]
  IMyServiceAgent agent { get;set;}

  public MyClient(){
     #resolve
 }

}


El concepto es simple. Tiene una representación interna de su servicio (IMyServiceAdaptor). Es importante que sea completamente independiente de las llamadas de proxy (referencia de servicio) subyacentes que realmente llaman a su servicio. La idea es que crees una interfaz amigable para tu servicio y te conectes con ella. Siempre adapta el servicio para cumplir con su API de interfaz de aplicaciones. Esto lo protegerá de los cambios en el lado del servicio, proporcionará la interfaz que puede usar para la inyección y le permitirá insertar algo de lógica adicional para hacer frente a la falla.

contestado el 16 de mayo de 11 a las 20:05

Creo que iré con el n. ° 2: hasta que lo mencionaste, no pensé en combinar "incluir un archivo de configuración" para cada app.config con un script de compilación para copiar la configuración compartida en cada uno. Aprecio la respuesta al n. ° 1, pero es más de lo que quiero lidiar con lo que es principalmente un dolor de cabeza. - Bobson

Después de tomarme un tiempo para trabajar en otras cosas, volví a este problema y encontré una pregunta relacionada sobre aquí. La respuesta de Trond a esa pregunta funcionó bien para mí y fue mucho más simple que cualquier otra cosa.

contestado el 23 de mayo de 17 a las 15:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.