2010-03-22 2 views
0

Je cherche à utiliser Subsonic avec une application Web ASP.net multi-locataire. Il y a plusieurs DB (un par client/instance). L'utilisateur se connecte avec un suffixe de domaine à son nom d'utilisateur (par exemple, utilisateur @ locataire1, utilisateur @ locataire2).Subsonic, SharedDbConnectionScope et ApplicationState

Le fournisseur d'appartenances personnalisées déterminera ensuite la base de données utilisée par un utilisateur et s'authentifiera auprès de celui-ci. Tous les appels initiés par l'utilisateur dans la webapp seront enveloppés dans un appel SharedDbConnectionScope, mais j'ai une question concernant la mise en cache des éléments subsoniques.

Fondamentalement chaque instance aura quelques enregistrements qui changent rarement (options de recherche/configurations). Je voudrais les lire dans l'événement Application_Start et les mettre en cache dans l'ApplicationState.

En cas Application_Start, il boucle sur chaque base de données client, utilisez un SharedDbConnectionScope pour se connecter à chaque DB, et de créer ces enregistrements mises en cache (par exemple Application (« tenant1_search_obj ») = subsonic_object

Lorsque charge un utilisateur la page de recherche, il vérifie alors dans quel domaine un utilisateur se trouve, puis récupère cette option de recherche à partir du cache

Est-ce faisable? Je suis juste concerné que si je cache un objet, quand je le récupère du cache de l'application, il ne saura pas quelle connexion son utilisation, et pourrait éventuellement tirer dans les mauvaises données

Je voudrais éviter de mettre ceci dans l'objet de session si possible.

Répondre

0

c'est possible, mais ce n'est probablement pas une bonne idée car cela ne va pas du tout - vous allez afficher une nouvelle connexion pour chaque client, qu'il apparaisse ou non. Peut-être que votre meilleur pari est de "charger paresseux" le réglage - premier coup sur la page de recherche charge la configuration dans le cache ou les paramètres d'application et il reste là.

Autre que cela - pour répondre à votre question c'est possible. Si vous utilisez SubSonic 3, créez simplement un nouveau fournisseur à la volée en utilisant ProviderFactory.GetProvider (connectionString, "System.Data.SqlClient"), puis exécutez vos tâches.

Pour SubSonic 2 - SharedConnectionScope est ce que vous voulez.

+0

merci pour le conseil sur le chargement paresseux/mise en cache. Cependant, lorsque je récupère les objets que j'ai mis en cache, se souviendront-ils de quelle base de données ils étaient? C'est à dire. si j'accède à des propriétés chargées paresseuses sur ces objets, vont-ils tirer de la bonne base de données? Ou est-ce que je devrais emballer n'importe quel usage d'objet dans un shareddbconnectionscope? Je ne pense pas pouvoir utiliser la méthode du fournisseur, car j'utiliserai quelques gestionnaires de données CodingHorror. – Dane

+0

Pas les objets - vous voulez mettre en cache les * paramètres *. –