2012-05-14 16 views
1

私はいくつかのコンポーネントをコンテナに登録しており、ウィンザーは問題なくそれらを注入できます。 は、今私は、このように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() 
        ); 
     } 

は今、私は以下を参照してください。

enter image description here

コンポーネントの実装は、「後期バウンド」でありますウィンザーはそれを注入しません。

どういうところが間違っていますか?私は何を確認できますか?

答えて

2

実行時にconfigインスタンスを作成しているとは思わないかもしれません。

あなたの設定に適したクラスを作成し、コンテナに登録し、それを使って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、テナントごとに1つずつ登録し、インストーラのループで:

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 
     ); 

} 

注、私はISessionFactory ISessionトランジェントを登録してではなく。通常は、作成するのに費用がかかるため、できるだけ長くISessionFactoryを保持する必要があります。

私はそれをテストしていませんが、セッションファクトリビルダの実装はコンパイル時に知られているように私は、それはそれを解決します推測しています。

3

ここには2つの別々の無関係な質問がありますので、順番に答えてください。

は、コンポーネント記述が言うようは、単にウィンザーは静的にISessionFactoryの実装タイプを知らないことを意味し、「遅延バインディング」。これは懸念の理由ではありません。

あなたが指定したファクトリメソッド(インスタンスの場合はconfig.BuildSessionFactory())をインスタンス化するだけで、毎回同じタイプではない場合もあります。これは、罰金と正常

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

一つは、のようなファクトリメソッドを実装する場合があります。

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

、あなたはそれについての詳細を説明しない限り、私は「それが動作する必要がある」と言うこと以外に助けることができますが、私はあまりないと思う見ているエラーの種類を共有します。

また、セッション中に一時的に工場を一時的にするということは、特に良いアイデアのようには聞こえません。

+0

config(FluentConfiguration)が実際にコンテナに登録されていない可能性はありますか? Fluently.Configure()は、コンテナで管理されていない新しいコンポーネントを作成するようなものですか? –

+0

番号。それが登録されているかどうかは関係ありません。私はそれを登録しません –

+0

@ KrzysztofKozmicあなたはこれを見て気になりますか: http://stackoverflow.com/questions/25064516/dependency-injection-lifestyle-service-shared-instance-between-2-instances-of? noredirect = 1#comment39052582_25064516 –

関連する問題