0

我正在尝试通过http://codeinsanity.com上的指南将 NCommon 和 NH 连接到多个数据库(请参阅“为多个数据库支持配置 NCommon”),它通过以下建议的流畅方法工作:

    var configuration = NCommon.Configure.Using(adapter).ConfigureState<DefaultStateConfiguration>();

    configuration.ConfigureData<NHConfiguration>(config => config.WithSessionFactory(() => _sessionFactories[0]).WithSessionFactory(() => _sessionFactories[1]));

这可以按预期工作,但您可以看到 sessionFactories 是硬编码的。我真正想做的是这样的:

     foreach(ISessionFactory sessionFactory in _sessionFactories)
     {
          configuration.ConfigureData<NHConfiguration>(config => config.WithSessionFactory(() => sessionFactory));
     }

但这会引发以下异常:

无法注册组件 NCommon.Data.NHibernate.NHUnitOfWorkFactory。已经有一个具有该名称的组件。您是否想修改现有组件?如果不是,请确保指定一个唯一名称。

我希望有一种正确的方法来连接 n-SessionFactories 而无需对其进行硬编码 - 但我只是没有看到解决方案。有什么建议吗?

4

1 回答 1

0

我认为我可以通过将 SessionFactory 部分委托给一个方法来实现这一点,如下所示:

    configuration.ConfigureData<NHConfiguration>(config => ConfigureSessionFactories(config));

    private void ConfigureSessionFactories(NHConfiguration configuration)
    {
        foreach (ISessionFactory sessionFactory in _sessionFactories)
        {
            configuration.WithSessionFactory(() => sessionFactory);
        }
    }

然而,这似乎只是一个解决方案。假设您有多个会话工厂,您可以使用它们全部进行查询,但只有最后添加的会话工厂会命中数据库并返回结果。针对其他会话工厂的查询永远不会到达实际数据库,并且将返回零个实体。

我能够让它工作的唯一方法是:

    configuration.ConfigureData<NHConfiguration>(config => config.WithSessionFactory(() => _sessionFactories[0]).WithSessionFactory(() => _sessionFactories[1]));

不过,我宁愿不对其进行硬编码。我更愿意遍历 n 会话工厂的循环...有没有人知道如何实现这一点?

于 2012-05-30T17:59:10.250 回答