Best Practice für ASP.NET MVC-Ressource-Dateien
-
18-09-2019 - |
Frage
Was ist die beste Nutzung der folgenden Ressourcendateien.
- Eigenschaften → Ressourcen ( Phil benutzten Ressourcen für die Lokalisierung in DataAnnotation)
- App_GlobalResources Ordner
- App_LocalResources Ordner
Ich würde auch gerne wissen, was ist der Unterschied zwischen (1) und (2) in asp.net MVC-Anwendung.
Lösung
Sie sollten App_GlobalResources
und App_LocalResources
vermeiden.
Wie Craig erwähnt, gibt es Probleme mit App_GlobalResources
/ App_LocalResources
, weil man sie nicht außerhalb der ASP.NET-Laufzeit zugreifen können. Ein gutes Beispiel dafür, wie dies wäre problematisch ist, wenn Sie Unit-Tests Ihre Anwendung sind.
K. Scott Allen gebloggt dies vor einer Weile. Er macht einen guten Job zu erklären, das Problem mit App_GlobalResources
in ASP.NET MVC hier .
Andere Tipps
Wenn Sie mit der empfohlenen Lösung gehen (1) (das heißt, wie in K. Scott Alle Blog):
Für diejenigen unter Ihnen versuchen explizite Lokalisierung Ausdrücke zu verwenden (auch bekannt als deklarative Ressource Bindungsausdrücke), z.B. <%$ 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);
}
}
Dann fügen Sie diese zu Ihrer web.config:
<globalization requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="utf-8" culture="en-US" uiCulture="en"
resourceProviderFactoryType="Vendalism.ResourceProvider.AppResourceProviderFactory" />
Eigenschaften → Ressourcen außerhalb Ihrer Ansichten und starke Typen erzeugt werden sehen, wenn Sie die Anwendung kompilieren.
app_ * wird von ASP.NET kompiliert, wenn Sie Ihre Ansichten zusammengestellt. Sie sind nur in der Ansicht verfügbar. Siehe Diese Seite für globale vs. lokal.