Multi-Tenant w / NHibernate + Castle Windsor (одно приложение, несколько баз данных) - PullRequest
3 голосов
/ 06 мая 2011

Создание мультитенантного приложения asp.net mvc 3 с одним экземпляром приложения / несколькими базами данных на каждого арендатора. Также будет отдельная «основная» база данных, в которой будет храниться информация об арендаторе (включенные функции, информация о подключении к базе данных арендатора и т. Д.). Новичок в NHibernate и IOC (Castle Windsor) и использовал этот учебник , чтобы получить базовую настройку CRUD.

Вот что я использую (из вышеупомянутого учебника), чтобы «использовать» NHibernate:

 public class PersistenceFacility : AbstractFacility
    {
        protected override void Init()
        {
            var config = BuildDatabaseConfiguration();

            Kernel.Register(
                Component.For<ISessionFactory>()
                    .UsingFactoryMethod(config.BuildSessionFactory),
                Component.For<ISession>()
                    .UsingFactoryMethod(k => k.Resolve<ISessionFactory>().OpenSession())
                    .LifeStyle.PerWebRequest);
        }

        private Configuration BuildDatabaseConfiguration()
        {
            return Fluently.Configure()
                .Database(SetupDatabase)
                .Mappings(m =>
                {
                    m.FluentMappings.AddFromAssemblyOf<SectionMap>()
                                    .Conventions.AddFromAssemblyOf<TableNameConvention>();
                })
                .ExposeConfiguration(ConfigurePersistence)
                .BuildConfiguration();
        }

        protected virtual AutoPersistenceModel CreateMappingModel()
        {
            var m = AutoMap.Assembly(typeof(EntityBase).Assembly)
                .Where(IsDomainEntity)
                .OverrideAll(ShouldIgnoreProperty)
                .IgnoreBase<EntityBase>();

            return m;
        }

        protected virtual IPersistenceConfigurer SetupDatabase()
        {
            return MsSqlConfiguration.MsSql2008
                .DefaultSchema("dbo") 
                .UseOuterJoin()
                .ProxyFactoryFactory(typeof(ProxyFactoryFactory))
                .ConnectionString(x => x.FromConnectionStringWithKey("MasterDB"))
                .ShowSql();
        }

        protected virtual void ConfigurePersistence(Configuration config)
        {
            SchemaMetadataUpdater.QuoteTableAndColumns(config);
        }

        protected virtual bool IsDomainEntity(Type t)
        {
            return typeof(EntityBase).IsAssignableFrom(t);
        }

        private void ShouldIgnoreProperty(IPropertyIgnorer property)
        {
            property.IgnoreProperties(p => p.MemberInfo.HasAttribute<DoNotMapAttribute>());
        }
    }

Подход, который я собираюсь использовать, заключается в том, что приложение будет искать заголовок / URL-адрес хоста, чтобы определить владельца, а затем запросить базу данных master, чтобы получить информацию о подключении базы данных соответствующего арендатора. Я предполагаю, что подход, который я должен использовать, состоит в том, чтобы иметь отдельный SessionFactory для каждого клиента - единственная проблема в том, что я не знаю, как (и где) его интегрировать. Был бы признателен за любую помощь / указатели, чтобы получить лучшее понимание того, как [а] решить эту проблему [б] получить лучшее понимание того, как использовать замок Виндзор. Извинения, поскольку сайт замка , кажется, большой ресурс, но его не так легко понять новичку, как я.

Спасибо!

Среда: ASP.NET MVC 3, .NET 4, Castle Windsor + Свободный NHibernate + NHibernate (через NuGet)

1 Ответ

1 голос
/ 06 мая 2011

обычно используется следующий подход: иметь несколько фабрик сессий (по одной на каждого арендатора) и использовать IHandlersSelector для выбора правильной базы на основе некоторых данных из запроса.

Что касается замечания о том, что документация не являетсяЛегко понять, мы стремимся улучшить его, если вы хотите указать на части, которые вам не очень-то понятны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...