Les meilleures pratiques pour les fichiers de ressources ASP.NET MVC
-
18-09-2019 - |
Question
Quels sont le meilleur usage des fichiers de ressources suivants.
- Propriétés → Ressources ( Phil a utilisé cette des ressources pour la localisation dans DataAnnotation)
- dossier App_GlobalResources
- dossier App_LocalResources
Je voudrais aussi savoir quelle est la différence entre (1) et (2) en asp.net mvc demande.
La solution
Vous devez éviter App_GlobalResources
et App_LocalResources
.
Comme Craig a mentionné, il y a des problèmes avec App_GlobalResources
/ App_LocalResources
parce que vous ne pouvez pas y accéder en dehors de l'exécution ASP.NET. Un bon exemple de la façon dont ce serait problématique est quand vous êtes tester l'unité de votre application.
K. Scott Allen blogué à propos de cela il y a un certain temps. Il fait un bon travail d'expliquer le problème avec App_GlobalResources
dans ASP.NET MVC ici .
Autres conseils
Si vous allez avec la solution recommandée (1) (à savoir que dans le blog de K. Scott Allen):
Pour ceux d'entre vous essayez d'utiliser des expressions explicites de localisation (expressions de liaison de ressources alias déclarative), par exemple <%$ 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);
}
}
Ensuite, ajoutez à votre web.config:
<globalization requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="utf-8" culture="en-US" uiCulture="en"
resourceProviderFactoryType="Vendalism.ResourceProvider.AppResourceProviderFactory" />
Propriétés → Les ressources peuvent être vues en dehors de vos vues et types forts sont générés lorsque vous compilez votre application.
* app_ est compilé par ASP.NET, lorsque sont compilés vos points de vue. Ils sont seulement disponibles dans la vue. Voir cette page mondiale contre locale.