2012-03-23 4 views
0

J'ai créé un programme avec Windows Forms en C# et l'architecture est quelque chose comme çaComment stocker des données ou persistent, il forme dans

* BaseClass.cs 
* EntityClass.cs 
* ControllerClass.cs 
* DataAccessClass.cs 
* Viewer.cs 

Donc, fondamentalement, la classe Entity hérite de la classe de base, et les données La classe d'accès va et récupère des données d'une base de données MySQL. Ce que je veux faire est de pouvoir utiliser les données tirées sans devoir appeler la classe d'accès aux données si je l'ai déjà tirée une fois. Où puis-je mettre ces données pour pouvoir y accéder n'importe où?

Je lisais sur la sérialisation en mémoire .. mais je veux obtenir un bon conseil ici sur où le mettre et si possible comment. J'apprécierais vraiment les pointeurs.

Cordialement

Répondre

1

On dirait que vous voulez continuer avec le modèle MVC, et introduire un composant "Modèle" qui est partagé entre vos 2 vues. Le modèle sera initialisé/actualisé en utilisant votre DataAccessClass. Chaque formulaire (ou vue) doit avoir une référence au modèle. Je ne suggérerais pas d'utiliser la sérialisation car vous partagez simplement un objet C# en mémoire dans le même processus entre 2 formulaires différents.

Par exemple:

public class MyFirstView : Form 
{  
    private ModelClass m_model; 
    public MyFirstView(ModelClass model) 
    { 
    m_model = model; 
    m_model.OnDataRefresh += this.Model_OnDataRefresh; 
    } 
} 

public class MySecondView : Form 
{  
    private ModelClass m_model; 
    public MySecondView(ModelClass model) 
    { 
    m_model = model; 
    m_model.OnDataRefresh += this.Model_OnDataRefresh; 
    } 
} 

public class ModelClass 
{ 
    private DataAccessClass m_dataAccess; 

    public event EventHandler OnDataRefresh = {}; // fired when data is refreshed 

    public void EnsureDataIsLoaded(); // queries the db if we haven't already 
    public void RefreshData(); // refreshes the data from the db 
    public IList<Entity> GetDataList(); // access to data items 
} 

Pour chaque formulaire/View, vous pouvez utiliser l'événement Form.Load pour rafraîchir la vue avec les données du modèle. Peut-être pourriez-vous avoir une méthode sur ModelClass.EnsureDataIsLoaded() qui utilisera DataAccessClass pour interroger la base de données si vous ne l'avez pas déjà fait. Et enfin, si le modèle change, vous avez besoin d'un moyen de pousser les changements à la (aux) vue (s). Pour ce faire, le modèle peut déclencher un événement lorsque les données sont actualisées et que chaque vue est abonnée à cet événement.

0

Je suggère d'utiliser une classe statique pour contenir les données. Si vous avez plusieurs formulaires ouverts simultanément, vous pouvez avoir un dictionnaire dans la classe statique avec un identifiant de formulaire.

+1

Et bien sûr, y compris les verrous nécessaires autour de la classe statique pour se protéger contre les bogues qui, de manière inhérente, provoquent l'utilisation de classes statiques pour tout sauf les données statiques. –

0

Vous ne devriez pas avoir besoin de sérialiser quoi que ce soit, vous pouvez simplement conserver les références dans une sorte de cache.

En supposant que vos classes d'accès aux données prennent une sorte de requête en paramètre, vous pouvez stocker les résultats dans un dictionnaire défini par la requête. Ensuite, vous vérifiez d'abord le cache pour les résultats de la requête, sinon, allez dans la base de données, récupérez-le et cachez-le. Si vous utilisez des expressions lambda pour vos requêtes, vous pouvez appeler la méthode .GetHashCode() pour obtenir un hachage unique pour ce lambda.

EX:

IDictionary<string, IEnumerable<T>> Cache; 

IEnumerable<T> GetData<T>(string query) 
{ 
    var key = typeof(T).Name + query; 
    if (!this.Cache.ContainsKey(key)) 
    { 
     // get from database 
     var data = SomeRepository.GetData(query); 
     this.Cache[key] = value; 
    } 

    return this.Cache[key] 
} 
0

Je vous suggère de jeter un oeil à la classe System.Runtime.Caching.MemoryCache. Cela pourrait servir votre besoin.

Questions connexes