1

コンテナにいくつかのコンポーネントを登録しましたが、Windsorは問題なくそれらを注入できます。これで、NHibernateISessionFactoryの新しい登録が次のように追加されました。

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はそれを注入しません。

どうしたの?何を確認できますか?

4

2 に答える 2

3

ここには 2 つの別々の無関係な質問があるので、順番に答えていきましょう。

コンポーネントの説明にあるように、 「レイト バウンド」とは、Windsor がISessionFactory静的に実装タイプを認識していないことを意味します。これは心配する必要はありません。

あなたの場合、インスタンスを構築するのは指定したファクトリメソッド次第であり、config.BuildSessionFactory()毎回同じタイプではないかもしれません。

次のようなファクトリ メソッドを実装できます。

public ISessionFactory BuildSessionFactory()
{
   if (Today == DayOfWeek.Friday)
   {
      return new BeerOClockSessionFactory();
   }
   return SomeOtherSessionFactory();
}

これは正常で問題ありません。

あなたがほのめかした他の質問は、への依存関係がISessionFactory期待どおりに満たされていない予期しない動作が発生している可能性があることを示しています。

悲しいことに、それについてもっと説明しない限り、あなたが見ているエラーの種類を共有してください。

また、私たちがそれに取り組んでいる間、私は@raulgに心から同意します。セッションファクトリーを一時的にすることは特に良い考えのようには思えません.

于 2012-05-14T21:27:41.747 に答える
2

実行時に構成インスタンスを作成するのはおそらく好きではありません。

構成に適切なクラスを作成し、それをコンテナに登録し、それを使用して 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();
    }

}

普通に登録できます。次に、テナントごとに 1 つずつ、複数の 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 は作成するのにコストがかかるため、できる限り長く保持する必要があります。

私はそれをテストしていませんが、セッション ファクトリ ビルダーの実装はコンパイル時に認識されるため、これで解決すると思います。

于 2012-05-14T17:26:16.543 に答える