4

私のウェブサイトでは、ASP MVC 2 + Fluent NHibernate を orm、IoC コンテナーの StructureMap として使用しています。

同一のメタデータを持つデータベースがいくつかあります (したがって、エンティティとマッピングは同じです)。ログオン ページで、ユーザーはログイン、パスワード、rememberme を入力し、ドロップダウン リストからサーバーを選択します (実際にはデータベースを選択します)。

Web.config にはすべての connstring が含まれており、実行時に変更されることはないと想定できます。

データベースごとに 1 つのセッション ファクトリが必要だと思います。

複数のデータベースを使用する前に、Application_Start の StructureMap ObjectFactory にクラスをロードしました

ObjectFactory.Initialize(init => init.AddRegistry<ObjectRegistry>());
ObjectFactory.Configure(conf => conf.AddRegistry<NhibernateRegistry>());

NhibernateRegistry クラス:

public class NhibernateRegistry : Registry
{
    public NhibernateRegistry()
    {
        var sessionFactory = NhibernateConfiguration.Configuration.BuildSessionFactory();

        For<Configuration>().Singleton().Use(
            NhibernateConfiguration.Configuration);
        For<ISessionFactory>().Singleton().Use(sessionFactory);
        For<ISession>().HybridHttpOrThreadLocalScoped().Use(
            ctx => ctx.GetInstance<ISessionFactory>().GetCurrentSession());
    }

}

Application_BeginRequest で、開いている nhibernate セッションを asp セッション (要求ごとの nhibernate セッション) にバインドし、EndRequest でそれらをバインド解除します。

 protected void Application_BeginRequest(
        object sender, EventArgs e)
    {            
            CurrentSessionContext.Bind(ObjectFactory.GetInstance<ISessionFactory>().OpenSession());             
    }

Q1: 認証されたユーザーに応じて、どの SessionFactory を使用すればよいかをどのように認識できますか? データベース名で満たされたUserDataのようなものですか(私は単純なFormsAuthenticationを使用しています)

ロギングには、log4net、つまりconnectionString(もちろんxml)を含むAdoNetAppenderを使用します。Q2: このデータベース アペンダーの複数の接続文字列を管理して、ログが現在のデータベースに書き込まれるようにするにはどうすればよいですか? xml を常に変更し、xml 構成をリセットする以外に、それを行う方法がわかりませんが、それは本当に悪い解決策です。

4

1 に答える 1

1

データベースごとに 1 つのセッション ファクトリが必要だと思います。

いいえ; 両方のデータベースに対して 1 つのセッション ファクトリで問題なく実行できます。

OpenSession()のメソッドに、開いている IDbConnection をパラメーターとして指定するだけですISessionFactory

そうすることで、2 番目のレベルのキャッシュの可能性が失われますが、問題にはならないかもしれません。

2 番目のレベルのキャッシュが必要な場合は、独自のものを実装DriverConnectionProviderし、流暢な nh のProvider<TYourDriverConnectionProvider>()メソッドを介して提供する必要があります。

于 2010-06-16T10:40:24.643 に答える