创建一个多租户asp.net mvc 3应用,每个租户具有单个应用实例/多个数据库。也将有一个单独的“主”数据库,其中包含特定于租户的信息(启用的功能,租户数据库连接信息等)。 NHibernate和IOC(Castle Windsor)的新手,并使用this tutorial进行了基本的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-唯一的问题是我不知道如何(以及在​​哪里)集成它。感谢您的帮助/指针,以便更好地了解如何[a]解决此问题[b]更好地了解如何使用温莎城堡。抱歉,castle site似乎是很好的资源,但像我这样的新手不容易理解。

谢谢!

环境:ASP.NET MVC 3,.NET 4,Castle Windsor + Fluent NHibernate + NHibernate(通过NuGet)

最佳答案

通常采用的方法是拥有多个会话工厂(每个租户一个),并使用IHandlersSelector根据请求中的某些数据选择正确的工厂。

关于不容易理解文档的说法,如果您想指出您觉得不太容易理解的部分,我们非常乐意加以改进。

关于asp.net-mvc - 带NHibernate + CaSTLe Windsor的 Multi-Tenancy (单个应用程序,多个数据库),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5906701/

10-11 01:34
查看更多