2008-12-12 3 views
1

J'ai une collection de commandes. Je voudrais frapper la base de données une fois, récupérer les commandes, les stocker, puis être en mesure d'accéder à cette collection sur plusieurs formulaires. Je sais dans asp.net, vous pouvez utiliser des choses comme l'objet d'application ou l'objet de session mais comment le faites-vous dans une application de forme gagnante? Je pensais à créer une collection statique accessible à travers plusieurs formes, classes ou n'importe où. Est-ce que cela semble juste et est-ce faisable?Bonne façon d'étirer l'objet sur plusieurs classes

grâce

Répondre

1

La différence fondamentale dans WebForms & WinForms est que WinForms est avec état. En d'autres termes, vous pouvez vous assurer que les objets que vous chargez une fois sont disponibles jusqu'à ce que le programme soit arrêté. La même chose n'est pas vraie pour WebForms car HTTP est sans état et ASP.Net tisse beaucoup de «magie» [ViewState, session de serveur, cookies, champs masqués etc.] pour coller ensemble les pages d'une application web.

Avec ce concept de base, il est facile de rendre un objet globalement disponible dans WinForms. Utilisez une classe Singleton/Static et affectez ses membres. Vous pouvez toujours dire .Instance .. [dans le cas de classes/classes statiques avec des propriétés statiques] pour extraire des valeurs de n'importe quel formulaire.

Un Gottcha est "thread-safety" ... aussi connu sous le nom de "multiples Forms" qui lisent/écrivent sur la propriété static en même temps. Si vous pouvez prendre soin de cela, le repos est un jeu d'enfant.

Pour votre problème ci-dessus:

Vous pourriez avoir votre propre classe Singleton cache qui cache les enregistrements. La classe Cache sera une implémentation de collection personnalisée. Vous devez vous assurer qu'il est compatible avec les threads [ou assurez-vous que votre application ne charge qu'une fois et lit ensuite] ... Vous devrez peut-être envisager un ORM complet si vous souhaitez que les modifications de la base de données soient reflétées dans vos objets entité .

CacheList.OrderCache[orderNo].Customer.Address.City = "Las Vegas";

class static CacheList { public static Cache OrderCache {get; internal set;}

}

public class Cache : CollectionBase where T : Entity { .....

}

0

Vous devriez avoir un objet de données qui accède à la base de données de toute façon, non? Envelopper dans une classe CacheProxy, qui frappe la base de données si elle n'a pas de copie locale. Je vous entends pouvez aussi use the System.Web cache in Winforms.

Questions connexes