Создание мультитенантного приложения 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)