Nous développons une application SaaS à plusieurs locataires à la mode de nos jours (database partagée, schéma partagé), et il y a une chose que je n'aime pas:
public class Domain : BusinessObject { public virtual long TenantID { get; set; } public virtual ssortingng Name { get; set; } }
Le TenantID
me TenantID
fou, comme il doit être pris en count presque partout, et c'est un problème de security: que se passe-t-il si un user API malveillant modifie TenantID
à une autre valeur et va mélanger les choses.
Ce que je veux faire est de se débarrasser TenantID
de ce TenantID
dans nos objects de domaine, et que NHibernate ou SQL Server s'occupe de lui.
D'après ce que j'ai déjà lu sur les Internets, ceci peut être fait avec CONTEXT_INFO
(voici une implémentation basée sur NHibernate ), des filters NHibernate , des Vues SQL et une combinaison de ceux-ci.
Maintenant, mes exigences sont les suivantes:
TenantID
des objects de domaine default
contraintes default
) Quelles sont vos pensées à ce sujet?
Je trouve que ce document est à peu près le Saint Graal de MultiTenant. http://msdn.microsoft.com/en-us/library/aa479086.aspx
Jetez un oeil à l'utilisation de l'une des approches telles que «Shared Database Shared Schema», puis connectez-vous à la database en utilisant un user SQL différent pour chaque locataire. Chaque user SQL verra un sous-set filtré des données et ne pourra récupérer que ses propres données, et lors de l'insertion des données, il lui sera assigné automatiquement son propre locataire.
Vous constaterez que vous n'avez plus besoin de tenir count des TenantID dans votre application et que vous pouvez simplement modéliser le rest des tables.
L'approche que j'utilise pour notre application SaaS avec db partagé et schéma partagé est montrée dans l' article de Jason Young.
Ceci dans le cadre de l' article de Jason Dentler que vous avez fourni dans votre question et de mappage des vues au lieu de arrays dans votre domaine constitue une solution assez isolée. Vous pouvez vous débarrasser complètement de TenantID de vos templates que j'aime beaucoup.
Dans mon application je l'utilise avec EntityFramework mais malheureusement, EF n'a pas une telle chose comme DriverConnectionProvider
qui est vraiment une honte.