私のウェブサイトでは、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 構成をリセットする以外に、それを行う方法がわかりませんが、それは本当に悪い解決策です。