2011-08-26 23 views
6

Tengo el requisito de que el usuario final puede cambiar los recursos localizados y los cambios deben ser visibles en la aplicación sin la necesidad de reiniciar la aplicación.Localización de ASP.NET: ¿Cambia recursos sin reiniciar la aplicación?

actualización para aclarar el panorama:
estoy hablando de cambiar los recursos localizados en tiempo de ejecución. Digamos que tengo un error tipográfico en la traducción al alemán de una página. Entonces, algún usuario administrador debería tener la posibilidad de cambiar ese error tipográfico en tiempo de ejecución. No debería haber necesidad de una reasignación o reinicio para que este cambio se refleje en la IU.

Estoy usando ASP.NET MVC3.

¿Qué opciones tengo?

He estado buscando escribir custom ResourceProvider que cargue recursos de la base de datos.
esto no parece demasiado esfuerzo, sin embargo hasta el momento he señalado dos inconvenientes:

  • No está trabajando con los DataAnnotations que se utilizan para la validación conveniente en MVC3 (DataAnnotations trabajan con un parámetro ErrorMessageResourceType, que sólo trabaja con recursos compilados)
  • Básicamente, tenemos que proporcionar nuestras propias herramientas para administrar recursos (como traducir, etc.) lo cual es una pena, ya que hay muchas herramientas para esto que funcionan con resx-files.

¿Cuáles son las otras opciones? ¿Sería una opción la manipulación de los archivos resx desplegados en tiempo de ejecución?
Pero sospecho que la aplicación se "reinicia" automáticamente cuando detecta esos cambios: sospecho que ASP.NET se da cuenta de que los archivos resx han cambiado, luego recicla el grupo de aplicaciones y compila los nuevos archivos resx en el mosca.
¿Es esto correcto? ¿Hay alguna forma de evitar esto?

Todavía no he examinado la compilación de los recursos en ensamblajes satélite antes de la implementación. ¿Es este un escenario recomendado para aplicaciones web?
Pero incluso con ensambles satelitales compilados sospecho que ASP.NET reinicia la aplicación, cuando esos ensambles se cambian sobre la marcha. ¿Es esto correcto?

Me interesaría cualquier experiencia sobre cómo se puede cumplir el requisito original? Y me interesaría cualquier comentario sobre las opciones que he mencionado anteriormente.

+1

¿Has probado el UpdatableResXResourceProvider propuesto en [esta respuesta] (http://stackoverflow.com/questions/1535027/app-domain-restarts-when-resx-file-changes-any-way-to-avoid-this/1853530 # 1853530)? –

+1

Lo siento, lo he entendido mal, para cambiar los recursos existentes en el tiempo de ejecución Creo que su única opción es un proveedor de recursos personalizado, pero no he visto ninguna solución limpia para resolver el problema de las anotaciones de datos sin recurrir a las anotaciones personalizadas. – TheCodeKing

+0

Tengo una forma de hacerlo, pero solo si las claves de recursos están corregidas. – TheCodeKing

Respuesta

1

Las anotaciones de datos aceptan un ErrorMessageResourceType que indica a ValidationAttrributes dónde acceder a los recursos. Puede pasar de la siguiente manera:

[Required(
    ErrorMessageResourceType = typeof(DynamicResources), 
    ErrorMessageResourceName = "ResourceKey")] 
public string Username { get; set; } 

Mediante la creación de un tipo de este parámetro con propiedades estáticas para cada tecla se puede crear una aplicación que los recursos de las cargas de una base de datos u otra aplicación. A continuación, puede combinar esto con un objeto dinámico para DRY y mover la implementación a TryGetMember.Potencialmente a continuación, utilizar las plantillas T4 para generar la estática de su base de datos en tiempo de compilación, para terminar con esto:

public class DynamicResources : DynamicObject 
{ 
    // move these into partial and generate using T4 
    public static string MyResource 
    { 
     get { return Singleton.MyResource; } 
    } 

    public static string MyOtherResource 
    { 
     get { return Singleton.MyOtherResource; } 
    } 

    // base implementation to retrieve resources 
    private static dynamic singleton; 

    private static dynamic Singleton 
    { 
     get { return singleton ?? (singleton = new DynamicResources()); } 
    } 

    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     // some logic here to look up resources 
     result = GetResourceKeyFromDatabase(binder.Name); 
     return true; 
    } 
} 

Por supuesto, sería perfecto si los recursos no eran propiedades estáticas.

+0

Esta solución no funciona con el enfoque del proveedor de recursos personalizados de MSDN que está vinculado en la pregunta. La anotación espera que el ErrorMessageResourceType tenga una propiedad estática con el ErrorMessageResourceName. Este no es el caso cuando implementa una búsqueda de recursos dinámicos. – jbandi

+0

OK, existe una alternativa, se basa en las claves de recursos fijos, pero luego, para usar los recursos en su aplicación, deben estar predefinidos de todos modos. – TheCodeKing

+0

¡Gracias! Eso es probablemente lo mejor que puedo obtener. Aún así, investigaré otras estrategias de validación antes de ir con esa solución ... – jbandi

Cuestiones relacionadas