我在Asp.net / MVC 2 /多租户应用程序中使用Castle ActiveRecord,SQL Server作为我的后端。
对于每个登录的用户,该应用程序会在运行时动态加载相应的数据库,如下所示:
IDictionary<string, string> properties = new Dictionary<string, string>();
properties.Add("connection.driver_class", "NHibernate.Driver.SqlClientDriver");
properties.Add("dialect", "NHibernate.Dialect.MsSql2005Dialect");
properties.Add("connection.provider", "NHibernate.Connection.DriverConnectionProvider");
properties.Add("proxyfactory.factory_class", "NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle");
properties.Add("connection.connection_string", strDBConnection);
InPlaceConfigurationSource source = new InPlaceConfigurationSource();
source.Add(typeof(ActiveRecordBase), properties);
ActiveRecordStarter.Initialize(new System.Reflection.Assembly[] { asm1 }, source);
strDBConnection
字符串来自另一个包含用户信息,相应数据库等的小型数据库。
情景:
我对此行为的一点理解是:ActiveRecordStarter
是一个静态对象。
有人可以帮我解决这种情况吗?
预期的行为: 每个用户只能安全,并行/同时访问自己的数据库。
非常感谢!
答案 0 :(得分:0)
ActiveRecordStarter.Initialize
只应在您的应用中被称为一次(在Global.asax的Application_Start中)。
要实现您的目标,请创建一个继承自NHibernate.Connection.DriverConnectionProvider
:
public class MyCustomConnectionProvider : DriverConnectionProvider
{
protected override string GetNamedConnectionString(IDictionary<string, string> settings)
{
return string.Empty;
}
public override IDbConnection GetConnection()
{
// Get your connection here, based on the request
// You can use HttpContext.Current to get information about the current request
var conn = Driver.CreateConnection();
conn.ConnectionString = ... // Retrieve the connection string here;
conn.Open();
return conn;
}
}
然后将connection.provider属性设置为您的类的名称:
properties.Add("connection.provider", "MyCompany.Domain.MyCustomConnectionProvider, MyCompany.AssemblyName");