Многопользовательская архитектура и NHibernate - PullRequest
3 голосов
/ 18 сентября 2008

Может ли кто-нибудь объяснить мне, наконец, какова лучшая стратегия для реализации прозрачной и быстрой поддержки мультитенантной функциональности в модели домена с поддержкой NHibernate?

Я ищу способ, как сохранить доменную логику как можно более изолированной от мультитенантных вещей, таких как фильтрация по TenantID и т. Д.

Ответы [ 6 ]

2 голосов
/ 06 апреля 2010

Я опубликовал в блоге подход к многопользовательскому режиму здесь , этот подход не идеален для всех ситуаций, однако он позволяет вам в значительной степени забыть о проблемах с многопользовательским режимом без необходимости использования третьего партийный продукт.

2 голосов
/ 30 октября 2008

Самый простой подход - использовать разные базы данных для каждого клиента.

Реализация мультитенантности таким способом позволяет эффективно писать приложение для одного арендатора и беспокоиться о мультитенантности только в том месте, где вы создаете / извлекаете сеанс.

Я еще не углубился в детали (мне нужно сделать что-то подобное через несколько месяцев), но я думаю, что самый простой способ управлять базой данных, к которой подключен сеанс, - это пользовательская реализация ISessionFactory, которая может определить, какое соединение использовать (на основе внешнего аспекта, такого как часть узла URL-адреса запроса).

Я видел по крайней мере один пост в сети, где-то обсуждается это, но я не могу найти ссылку в настоящее время.

Если вы используете Castle Windsor, взгляните на средство интеграции NHibernate. Это поддерживает концепцию нескольких (именованных) фабрик сессий, которые позволят вам иметь фабрику сессий для каждого клиента. Средство интеграции предоставляет интерфейс ISessionManager, который позволяет открывать сеанс в именованной фабрике сеансов (а также предоставлять семантику сеансов по запросу для веб-приложений). Все, что требует доступа к сеансу, может просто принять параметр конструктора ISession, и вы можете создать фабрику, которая принимает ISessionManager в качестве параметра конструктора. Затем ваша фабрика может открыть сеанс в соответствующей именованной фабрике сеансов, проверив запрос, чтобы определить, какую именованную фабрику сеансов следует использовать.

1 голос
/ 05 декабря 2008

Существует множество способов сделать это, но проблемы multi -производства идут глубже, чем просто модель данных. Я ненавижу подключать продукт, но посмотрите SaaSGrid моей компании, в которой я работаю, Apprenda . Мы являемся облачной операционной системой, которая позволяет вам писать приложения SOA для одного клиента (не стесняйтесь использовать NHibernate для доступ к данным), который автоматически внедряет мультитенантность в ваше приложение Когда вы публикуете свое приложение, вы можете делать такие вещи, как выбор модели данных (изолированной базы данных или совместно используемой), и SaaSGrid будет развертываться соответствующим образом, и ваше приложение будет работать без каких-либо изменений кода - просто напишите код, как если бы это было для одного владельца!

1 голос
/ 30 октября 2008

Я также копался в этом для моего следующего проекта. Вы можете реализовать собственный IConnectionProvider и зарегистрировать его в конфигурации с помощью «connection.provider».

Я предлагаю вам извлечь из DriverConnectionProvider и переопределить ConnectionString, а не реализовывать полностью пользовательский.

Это может быть что-то вроде этого:

    public class ContextualConnectionProvider : DriverConnectionProvider
    {

        protected override string ConnectionString
        {
            get
            {
                return GetCurrentTenantDatabaseConnectionStringInternally();
            }
        }

        public override void Configure(IDictionary<string, string> settings)
        {
            ConfigureDriver(settings);
        }

    }

Надеюсь, это поможет.

0 голосов
/ 21 июля 2009

Использование подхода с использованием общей схемы требует, чтобы вы перехватывали и украшали все ваши запросы дополнительной информацией, чтобы ограничить результаты.

NHibernate предоставляет перехватчики для этого, и слушатели событий также доступны из NHibernate 2.0 Aplpha 1.

См. http://elegantcode.com/2008/05/15/implementing-nhibernate-interceptors/ и http://www.codinginstinct.com/2008/04/nhibernate-20-events-and-listeners.html для обсуждения этих вопросов.

Также взгляните на компонент Rhino Security Айенде, так как он проделывает большую работу в этом направлении, чтобы модифицировать запросы с дополнительными ограничениями на основе дескрипторов безопасности. Вы можете просмотреть исходный код по адресу https://rhino -tools.svn.sourceforge.net / svnroot / rhino-tools / trunk / security

0 голосов
/ 18 сентября 2008

Ayende имеет несколько хороших постов в блоге о создании мультитенантных приложений. То, как NHibernate используется для этого, будет зависеть от типа многопользовательской аренды.

...