2012-05-10 10 views
4

私は、Autofacで動作するSingletonインスタンスを取得しようとしています。私はちょうど実験であるので、Winformsでquasi-mvvmのタイプのことをやっているので、それに掛かることはありません。今Autofac SingleInstance not working

var cb = new ContainerBuilder(); 
cb.RegisterType<CalculateCommissionCommand>().As<ICommand<TradeEntry>>().SingleInstance(); 
cb.RegisterType<CalculationsModel>().As<ICalculationsModel>().SingleInstance(); 
cb.Register(c => new CalculationsView() { Model = c.Resolve<ICalculationsModel>() }).SingleInstance(); 
cb.Build(); 

:私は、コンテナの次のセットアップを持っている

:しかし、私はあなたが私のモデルは、コマンドで参照(ここでのICommandは、WPF品種ではありません)で、単一のインスタンスであることが持っているしようとしていますCommandはICalculationsModelをコンストラクターパラメーターとして取ります。ただし、モデルに値を設定してコマンドに渡すと、その値はCalculationsViewで既に設定されているモデル内には表示されません。 "singleInstance"メソッドが呼び出されているにもかかわらず、コマンドとビューにCalculationsModelの別のインスタンスが渡されているようです。何か不足していますか?なぜこうなった?

+0

ローカルの自動インクリメンタルインスタンス化フィールドを持つ静的カウンタを少し掘り下げてみると、実際にはオートファックは毎回新しいインスタンスを作成しています。ビューに渡されるインスタンスはID = 1であり、コマンドに渡されるインスタンスはID = 2です。これは、コンストラクターが2回呼び出された場合にのみ発生します。何がありますか?オートファックはそれを壊すことはできません? – Bitfiddler

+0

コンストラクタにブレークポイントを置き、実際に2回起こっているかどうか確認してください – jlew

+1

はい。コンストラクタは2回呼び出されます。 – Bitfiddler

答えて

4

あなたのコードからは、コンテナをどのように格納/使用しているかは分かりません。複数のコンテナを作成した可能性があります。

7

今日も同様の問題が発生しましたが、これはこの質問が尋ねられる唯一の投稿と思われるので、誰かを助けることを期待して私たちの経験を共有すると思いました。最終的には、目の前に何かがありました。もちろん、彼らは通常、解決するのが最も難しい問題です:-)。私たちのシナリオでは

は、我々は次の通りであった:

  1. は、アセンブリ内の特定の種類を[自動登録の設定プロバイダの特定の実装を登録します。

これらの線に沿って何か:

var cb = new ContainerBuilder(); 
cb.RegisterType<FileBasedConfigurationProvider>() 
    .As<IConfigurationProvider>() 
    .SingleInstance(); 

cb.RegisterAssemblyTypes(typeof(MailProvider).Assembly) 
    .Where(t => !t.IsAbstract && t.Name.EndsWith("Provider")) 
    .AsImplementedInterfaces(); 

愚か、私たちは、FileBasedConfigurationProviderMailProviderと同じアセンブリにあったことを実現/について考えていなかったので、第2の登録呼び出しは、基本的に最初のものを上書き;したがって、SingleInstanceは「機能していませんでした」。

誰かを助ける希望!

+3

+1、今日はまったく同じミスを犯しました。あなたがそれについて考えるとき、それはとても明白ですが、あなたがそれの厚いところにいるときに見るべき最も簡単なことではありません。いくつかのデバッグ時間を節約してくれてありがとう:) – wasatz

0

私の場合は問題ではなく、インタフェース の第2のインスタンスを生成するメソッドのパラメータは、クラスとして定義されたということであった

SomeMethod(ClassName parameter) 

すなわち代わり

SomeMethod(**I**ClassName parameter) 

の明らかなミス、それを見るには数分かかりました。