Nhibernate Spring+Hibernate-多个数据库

Nhibernate Spring+Hibernate-多个数据库,nhibernate,spring.net,Nhibernate,Spring.net,我正在创建一个asp.NETMVC网站,我需要一个建议。我有以下几层: 数据库 数据访问层域对象、DAO接口+基于NHibernate的DAO实现 服务层服务接口+服务实现 表示层ASP.NET MVC 实际上有几个数据库: 一个具有通用数据和客户列表的数据库 多个数据库-每个数据库针对一个客户,具有相同的结构,但不一定在同一台服务器上 DAO和服务通过以下方式链接: MyMainService (contains business logic) MyMainDao (contains da

我正在创建一个asp.NETMVC网站,我需要一个建议。我有以下几层:

数据库 数据访问层域对象、DAO接口+基于NHibernate的DAO实现 服务层服务接口+服务实现 表示层ASP.NET MVC 实际上有几个数据库:

一个具有通用数据和客户列表的数据库 多个数据库-每个数据库针对一个客户,具有相同的结构,但不一定在同一台服务器上 DAO和服务通过以下方式链接:

MyMainService (contains business logic)
  MyMainDao (contains data access functions)
    MyMainSessionFactory (session factory for the main database)
      MyMainDbProvider (db provider with a connection to the main database)
或:

或同时使用两个数据库进行混合:

MySuperService (contains business logic)
  MyMainDao (contains data access functions)
    MyMainSessionFactory (session factory for the main database)
      MyMainDbProvider (db provider with a connection to the main database)
  MyCustomerDao (contains data access functions)
    MyCustomerSessionFactory (session factory for the customer database)
      MyCustomerDbProvider (db provider with a connection to the main database)
我正在两个提供程序中使用属性占位符和PropertyPlaceHolderConfigure

在这里,我想在ASP.NET MVC控制器中使用这些服务:

如果我想使用MyMainService,没有问题——我使用DI,一切正常

但如果我想使用MyCustomerService或MySuperService,我不认为我可以使用DI,而是更多的依赖拉动。 我认为我应该创建一个服务工厂,我将把客户ID和服务工厂传递给它 将返回连接到相应数据库的服务。比如:

TService GetService<TService>(int customerId)
{
  CustomerInfo info = GetCustomerInfo(customerId);
  IConfigurableApplicationContext context = (IConfigurableApplicationContext)WebApplicationContext.GetRootContext();
  PropertyPlaceholderConfigurer conf = (PropertyPlaceholderConfigurer)context.GetObject("PropertyPlaceholderConfigurer");
  conf.Properties["db.datasource"] = info.DataSource;
  conf.Properties["db.user"] = info.UserName;
  conf.Properties["db.password"] = info.Password;
  conf.Properties["db.database"] = info.DatabaseName;
  context.AddObjectFactoryPostProcessor(conf);
  context.Refresh();
  IEnumerator it = context.GetObjectsOfType(typeof(TService)).Values.GetEnumerator();
  if (it.MoveNext())
  {
    return (TService)it.Current;
  }
}
这是正确的方法还是我完全错了,我应该用其他方法来做

注意:在某些情况下,我希望同时为不同的客户使用相同的服务,例如:

  IMyService s1 = GetService<IMyService>(1);
  IMyService s2 = GetService<IMyService>(2);
  s1.importData(s2.exportData());
如有任何建议,将不胜感激


非常感谢

在MySuperService中,您同时使用bean MyMainDao和MyCustomerDao。这是因为它们有不同类型的Java类

如果您想要一个可以返回其中任何一个的工厂,请使用与MySuperService中相同的方法,但不要依赖于类型,而是为这两个bean指定不同的名称。这样,您的工厂可以按名称查找它们,您可以说:

connector = factory.lookup("name");

我不知道你的意思。你能再描述一下吗?谢谢
connector = factory.lookup("name");