A melhor prática para arquivos de recursos ASP.NET MVC
-
18-09-2019 - |
Pergunta
O que são o melhor uso dos seguintes arquivos de recursos.
- Propriedades ? Recursos ( Phil utilizado este recurso para localização em DataAnnotation)
- App_GlobalResources pasta ??li>
- App_LocalResources pasta ??li>
Eu também gostaria de saber qual é a diferença entre (1) e (2) em asp.net mvc aplicativo.
Solução
Você deve evitar App_GlobalResources
e App_LocalResources
.
Como Craig mencionado, há problemas com App_GlobalResources
/ App_LocalResources
porque você não pode acessá-los fora do tempo de execução ASP.NET. Um bom exemplo de como isso seria problemático é quando você está unidade testar seu aplicativo.
K. Scott Allen escrevi sobre isso um tempo atrás. Ele faz um bom trabalho de explicar o problema com App_GlobalResources
em ASP.NET MVC aqui .
Outras dicas
Se você vai com a solução recomendada (1) (ou seja, como no blog de K. Scott Allen):
Para aqueles de vocês tentando usar expressões localização explícita (aka expressões de ligação de recursos declarativas), por exemplo <%$ 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);
}
}
Em seguida, adicione isso ao seu web.config:
<globalization requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="utf-8" culture="en-US" uiCulture="en"
resourceProviderFactoryType="Vendalism.ResourceProvider.AppResourceProviderFactory" />
Propriedades ? Recursos podem ser vistos fora de seus pontos de vista e tipos fortes são gerados quando você compilar o aplicativo.
App_ * é compilado por ASP.NET, quando seus pontos de vista são compilados. Eles só estão disponíveis na vista. Consulte desta página para vs. global local.