La mejor práctica para archivos de recursos de ASP.NET MVC
-
18-09-2019 - |
Pregunta
¿Cuáles son el mejor uso de los archivos de recursos siguientes.
- Propiedades → Recursos ( Phil utilizó este de recursos para localización en DataAnnotation) carpeta
- App_GlobalResources carpeta
- App_LocalResources
También me gustaría saber cuál es la diferencia entre (1) y (2) en la aplicación asp.net mvc.
Solución
Debe evitar App_GlobalResources
y App_LocalResources
.
Al igual que Craig se ha mencionado, hay problemas con App_GlobalResources
/ App_LocalResources
porque no se puede acceder a ellos fuera del tiempo de ejecución de ASP.NET. Un buen ejemplo de cómo esto podría ser problemático es cuando estás unidad de pruebas de su aplicación.
K. Scott Allen escribió en su blog sobre esto hace un tiempo. Él hace un buen trabajo de explicar el problema con App_GlobalResources
en ASP.NET MVC aquí .
Otros consejos
Si vas con la solución recomendada (1) (es decir, como en el blog de de K. Scott Allen):
Para aquellos de ustedes tratando de utilizar expresiones de localización explícitas (expresiones de enlace de recursos de alias declarativa), por ejemplo, <%$ Resources, MyResource:SomeString %>
public class AppResourceProvider : IResourceProvider
{
private readonly string _ResourceClassName;
ResourceManager _ResourceManager = null;
public AppResourceProvider(string className)
{
_ResourceClassName = className;
}
public object GetObject(string resourceKey, System.Globalization.CultureInfo culture)
{
EnsureResourceManager();
if (culture == null)
{
culture = CultureInfo.CurrentUICulture;
}
return _ResourceManager.GetObject(resourceKey, culture);
}
public System.Resources.IResourceReader ResourceReader
{
get
{
// Not needed for global resources
throw new NotSupportedException();
}
}
private void EnsureResourceManager()
{
var assembly = typeof(Resources.ResourceInAppToGetAssembly).Assembly;
String resourceFullName = String.Format("{0}.Resources.{1}", assembly.GetName().Name, _ResourceClassName);
_ResourceManager = new global::System.Resources.ResourceManager(resourceFullName, assembly);
_ResourceManager.IgnoreCase = true;
}
}
public class AppResourceProviderFactory : ResourceProviderFactory
{
// Thank you, .NET, for providing no way to override global resource providing w/o also overriding local resource providing
private static Type ResXProviderType = typeof(ResourceProviderFactory).Assembly.GetType("System.Web.Compilation.ResXResourceProviderFactory");
ResourceProviderFactory _DefaultFactory;
public AppResourceProviderFactory()
{
_DefaultFactory = (ResourceProviderFactory)Activator.CreateInstance(ResXProviderType);
}
public override IResourceProvider CreateGlobalResourceProvider(string classKey)
{
return new AppResourceProvider(classKey);
}
public override IResourceProvider CreateLocalResourceProvider(string virtualPath)
{
return _DefaultFactory.CreateLocalResourceProvider(virtualPath);
}
}
A continuación, añadir esto a su web.config:
<globalization requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="utf-8" culture="en-US" uiCulture="en"
resourceProviderFactoryType="Vendalism.ResourceProvider.AppResourceProviderFactory" />
Propiedades → Los recursos pueden ser vistos fuera de sus puntos de vista y tipos fuertes son generados al compilar su aplicación.
* app_ está compilado por ASP.NET, cuando se compilan sus puntos de vista. Sólo están disponibles en la vista. Ver esta página para del planeta contra el local.