J'ai besoin de créer une classe de base comme le code suivant.Est-il possible de créer un champ statique sur la classe de base mais affecter comme créer sur la classe enfant?
public class ResourceBase
{
protected static IDictionary<string, XDocument> resources;
protected static IDictionary<string, XDocument> Resources
{
get
{
if (resources == null)
{
// cache XDocument instance in resources variable seperate by culture name.
// load resx file to XDocument
}
return resources;
}
}
protected static string GetString(string resourceKey)
{
return GetString(resourceKey, System.Threading.Thread.CurrentThread.CurrentUICulture.Name);
}
protected static string GetString(string resourceKey, string cultureName)
{
// get data from XDocument instance
var result = (
from rs in Resources
let node = rs.Value.Root.Elements(XName.Get("data")).SingleOrDefault<XElement>(x => x.Attribute(XName.Get("name")).Value == resourceKey)
where
(rs.Key == DEFAULT_CULTUREKEY || cultureName == rs.Key) &&
node != null
orderby cultureName == rs.Key descending
select node.Element(XName.Get("value"))
).FirstOrDefault<XElement>();
return result.Value;
}
}
Ensuite, je crée une classe enfant comme le code suivant.
public class MainResource : ResourceBase
{
public static string AppName
{
return GetString("AppName");
}
}
public class OtherResource : ResourceBase
{
public static string OtherName
{
return GetString("OtherName");
}
}
J'ai un problème parce que la variable de ressource dans la classe de base. Toutes les classes enfant utilisent une variable Ressource. Ainsi, ils utilisent toujours la même instance XDocument en cache. Avez-vous une idée pour réparer mon code source?
PS. J'ai trouvé un attribut comme ContextStaticAttribute qui indique que la valeur d'un champ statique est unique pour un contexte particulier. Je pense un contexte particulier devrait être le fil de différence. Donc, je ne peux pas l'utiliser pour résoudre cette question.
Merci,
Alors, quel est le problème? Que MainResource et OtherResource ne doivent pas partager des informations de ressources mises en cache? Vous pouvez passer un nom de fichier via le constructeur et ne pas utiliser d'implémentations statiques. – sisve
Je dois utiliser une variable statique car il est facile de partager une variable pour un projet multi-tiers sans se préoccuper de l'initialisation, de la mise en cache ou des performances. –