2012-05-14 16 views
6

ejemplo:¿Es posible cambiar dinámicamente el espacio de nombres a ServiceContract durante el tiempo de ejecución?

[ServiceContract(Namespace = "@[email protected]/", 
     Name = "FedExContract")] 

Necesito cambiar el valor de "@ services.url @" en tiempo de ejecución.

+0

¿por qué ** necesita ** para cambiar el espacio de nombres durante el tiempo de ejecución? –

+0

Esto es para admitir algunos de los procesos existentes. Mi cliente está usando Eclipse para publicar los servicios en IIS y ellos reemplazan estas etiquetas durante el tiempo de compilación. Planeo portar todos estos valores a la base de datos en lugar del proceso de compilación. – WinFXGuy

+0

No puedo imaginar que esto sea posible, me refiero a cómo funcionaría. ¿Cuándo cambiaría el espacio de nombres? ¿Verificaría cada vez que se invocara el servicio? Solo puedo ver algo que funciona cuando el servicio se reinicia cuando quizás se puede leer algo de un DB, pero esto no cambia en el tiempo de ejecución, solo se actualiza al inicio. Su procedimiento actual no está cambiando en tiempo de ejecución, por lo que no estoy seguro de por qué es un requisito ahora. –

Respuesta

0

no puede pensar en cualquier otra que el uso de los símbolos de compilación condicional, es decir

#if Debug 
[ServiceContract(Namespace = "@[email protected]/", Name = "FedExContract")] 

#endif 

espacios de nombres están destinados a ser estática, puede que tenga que volver a crear el proxy de cliente si cambia el espacio de nombres del contrato.

+0

Puede ser esta es la única opción que queda. – WinFXGuy

0

Puede cambiarlo durante el tiempo de ejecución. Pero sería mucho trabajo y tendría que suceder antes de que comenzara el servicio. Una vez que se inicia el servicio, no puede modificar la información del contrato.

Personalmente, no me gusta un inicio de servicio que dependa de la base de datos. Si algo se rompe, el servicio nunca aparece y la solución de problemas puede ser un proceso complicado para TI. Si tuviera que ir a la ruta de tiempo de ejecución, almacenaría el valor del espacio de nombres en mi archivo de configuración. Simplemente lo mantiene simple, y aún habilita un reemplazo de token de implementación posterior como lo describe en su pregunta.

De los comentarios mencionas proceso de compilación. Así es como lo manejamos: hacer que el espacio de nombres sea una cadena constante. Así, por ejemplo:

[DataContract(Namespace=Constants.CURRENT_NAMESPACE] 
public class MyClass 
{ } 

Ahora en un archivo de declarar por separado:

// in a separate file define: 
public static class Constants 
{ 
    public const string CURRENT_NAMESPACE = "url://Services"; 
}; 

Cuando se quiere construir para un intercambio de entorno diferente a cabo el archivo de constantes para una nueva definición:

//As a part of your build process switch the Constants file: 
public static class Constants 
{ 
    public const string CURRENT_NAMESPACE = "url://Eclipse/Services"; 
}; 

Es fácil de administrar, siempre sabe qué espacio de nombres se está usando ... y el servicio siempre comienza. ¿Eso funciona?

+0

Hacemos algo similar. ¿Hay alguna forma de que esto se pueda hacer desde MS Build en lugar de usar Eclipse/Ant? – WinFXGuy

+0

Estoy seguro de que existe, pero no soy la persona adecuada para preguntar. Puede ser una buena segunda pregunta para publicar. – ErnieL

Cuestiones relacionadas