我的容器中已注册了多个组件,Windsor可以毫无问题地注入它们。
现在,我以这种方式为NHibernate ISessionFactory添加了新的注册:

foreach (KeyValuePair<string, string> _tenantItem in _contextWrapper.TenantsConnectionStrings)
        {
            var config = Fluently.Configure()
                .Database(
                    MsSqlConfiguration.MsSql2008
                    .UseOuterJoin()
                    .ConnectionString(_tenantItem.Value)
                    .FormatSql()
                    .ShowSql()
                )

                .ExposeConfiguration(ConfigurePersistence)
                .ProxyFactoryFactory(typeof(ProxyFactoryFactory))
                .BuildConfiguration();

            Kernel.Register(
                Component.For<ISessionFactory>()
                    .UsingFactoryMethod(config.BuildSessionFactory)
                    .Named(_tenantItem.Key)
                    .LifestyleTransient()
                    );
        }


现在,如果我尝试检查我的容器,我会看到:



组件实现是“后期绑定”的,Windsor不会注入它。

怎么了?我可以检查什么?

最佳答案

可能不喜欢您在运行时创建配置实例。

您最好为配置创建一个合适的类,将其注册到容器中,然后使用该类来创建ISessionFactory实例。

public class MySessionFactoryBuilder : IMySessionFactoryBuilder
{
    private FluentConfiguration _fluentConfiguration = null;

    public MySessionFactoryBuilder()
    {
    }

    void Initialize(string connectionStringKey)
    {
        IPersistenceConfigurer persistenceConfigurer = null;

        persistenceConfigurer = MsSqlConfiguration.MsSql2008
                .UseOuterJoin()
                .ConnectionString(connectionStringKey)
                .FormatSql()
                .ShowSql()
                ;

        _fluentConfiguration = Fluently.Configure()
            .Database(persistenceConfigurer)
            .ExposeConfiguration(ConfigurePersistence)
            .ProxyFactoryFactory(typeof(ProxyFactoryFactory))
            .BuildConfiguration()
            ;
    }

    public ISessionFactory BuildSessionFactory(string connectionStringKey)
    {
        Initialize(connectionStringKey);
        return _fluentConfiguration.BuildSessionFactory();
    }

}


您可以正常注册。然后,在安装程序循环中注册多个ISessionFactory,每个租户一个:

foreach (KeyValuePair<string, string> _tenantItem in _contextWrapper.TenantsConnectionStrings)
{

    container.Register(
    Component.For<ISessionFactory>()
        .UsingFactoryMethod(k => k.Resolve<MySessionFactoryBuilder>().BuildSessionFactory(_tenantItem.Value))
        .Named(_tenantItem.Key),

    Component.For<ISession>()
        .UsingFactoryMethod(k => k.Resolve<ISessionFactory>().OpenSession())
        .Named(_tenantItem.Key + "-nhsession")
        .LifeStyle.Transient
        );

}


注意,我注册了ISession瞬态,但没有注册ISessionFactory。通常,您希望将ISessionFactory保留得尽可能长,因为创建起来很昂贵。

我还没有测试它,但是我猜它会解决它,因为在编译时就知道会话工厂构建器的实现。

关于c# - 温莎城堡的“后期绑定(bind)”组件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10579913/

10-13 07:39