在我的网站中,我使用 ASP MVC 2 + Fluent NHibernate 作为 orm,IoC 容器的 StructureMap。
有几个具有相同元数据的数据库(因此实体和映射是相同的)。在登录页面上,用户填写登录名、密码、记住我并从下拉列表中选择他的服务器(实际上他选择了数据库)。
Web.config 包含所有连接字符串,我们可以假设它们不会在运行时更改。
我想每个数据库都需要一个会话工厂。
在使用多个数据库之前,我在 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,即 AdoNetAppender,其中包含 connectionString(当然是在 xml 中)。Q2:我如何管理这个数据库附加程序的多个连接字符串,以便将日志写入当前数据库?除了一直更改 xml 和重置 xml 配置之外,我不知道该怎么做,但它确实是一个糟糕的解决方案。