2011-05-06 11 views
3

テナントごとに1つのアプリケーションインスタンス/複数のデータベースを持つマルチテナントasp.net mvc 3アプリケーションを作成する。テナント固有の情報(有効な機能、テナントDB接続情報など)を格納する別の「マスター」データベースもあります。初心者はNHibernate & IOC(Castle Windsor)とthis tutorialを使って、基本的なCRUDセットアップを行っています。NHibernate + Castleウィンザー付きマルチテナント

次は、私は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を見てしまうということですテナントを決定し、次に「マスタ」データベースに問い合わせてそれぞれのテナントのデータベース接続情報を取得します。私は、クライアントごとに個別のSessionFactoryを持たなければならないというアプローチを推測しています。問題を解決するには、どのように(そしてどこで)統合するのか分かりません。 Castle Windsorの使い方をよりよく理解するために、この問題を解決する方法をよりよく理解するための助けと指針を感謝します。 castle siteのような謝罪は素晴らしいリソースのようですが、私のような初心者には分かりません。

ありがとうございます!

環境:ASP.NET MVC 3、.NET 4、城ウィンザー+流暢NHibernateは+ NHibernateは通常とらのアプローチは、複数のセッションファクトリ(テナントごとに1つ)を有するとIHandlersSelectorを使用することである

答えて

1

(NuGetを介して)要求からのいくつかのデータに基づいて正しいものを選ぶ。

ドキュメントが簡単に理解できないという点については、あまりにも容易ではない部分を指摘したいと思っている場合は、ドキュメントを改善したいと考えています。

+0

IHandlerSelectorは素晴らしく、AyendeさんとMike Hadlowさんの投稿も見つかりました。しかし、テナント固有のdb接続情報をマスタdbから取得し、それを使用してテナント用の新しいセッションファクトリを作成する方法についてはまだよく分かりませんが、masterデータベースの場合と同じように 'persistancefacility'に似ています。ドキュメンテーションについての発言に関しては、いくつかの詳細や実際の例を明示することで、誰かがIOCの概念を初めて理解しやすくなると思います。ありがとう! – saasn00b

関連する問題