ホーム>source

Autofacで動作するシングルトンインスタンスを取得しようとしています。私は、Winformsでquasi-mvvmタイプのことをしているので、ただの実験なので、それに夢中にならないでください。しかし、私はあなたが私のモデルをコマンドの参照を持つ単一のインスタンスにしようとしています(ここのICommandはWPFの種類ではありません):

コンテナの次の設定があります:

<前>ウィズウィズ

これで、コマンドはICalculationsModelをコンストラクターパラメーターとして受け取ります。ただし、コマンドに渡されるモデルに値を設定すると、CalculationsViewで既に設定されているモデル内にその値が表示されません。 「singleInstance」メソッドが呼び出されているにもかかわらず、コマンドとビューにCalculationsModelの異なるインスタンスが渡されているようです。何か不足していますか?なんでこんなことが起こっているの?

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();
あなたの答え
  • 解決した方法 # 1

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

  • 解決した方法 # 2

    今日、同様の問題にぶつかりましたが、これはこの質問が行われる唯一の投稿のようです。そのため、誰かの助けになることを期待して、私たちの経験を共有したいと思いました。結局のところ、それは私たちの目の前にあるものであり、もちろんそれらは通常、解決するのが最も難しい問題です:-)。

    このシナリオでは、次のようになりました。

    構成プロバイダーの特定の実装の登録

    アセンブリ内の特定のタイプを自動登録します。

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

    <前>ウィズウィズ

    愚かに、私たちは var cb = new ContainerBuilder(); cb.RegisterType<FileBasedConfigurationProvider>() .As<IConfigurationProvider>() .SingleInstance(); cb.RegisterAssemblyTypes(typeof(MailProvider).Assembly) .Where(t => !t.IsAbstract && t.Name.EndsWith("Provider")) .AsImplementedInterfaces(); について考えていなかった/実現しなかった   FileBasedConfigurationProvider と同じアセンブリにありました 、したがって、2番目の登録呼び出しは基本的に最初の呼び出しを上書きしました。したがって、 MailProvider  「機能しませんでした」。

    それが他の誰かを助けることを願っています!

  • 解決した方法 # 3

    私の場合、問題は、2番目のインスタンスを生成するメソッドへのパラメーターが、インターフェイスではなくクラスとして定義されていることでした。 つまり

    <前>ウィズウィズ

    の代わりに

    <前>ウィズウィズ

    明らかな間違いですが、それを見るのに数分かかりました。

  • 解決した方法 # 4

    私の場合、異なるインターフェイスのクラスに2つの登録があり、それぞれが単一のインスタンスであることを宣言しました。私は、クラスの単一のインスタンスがあると仮定しました...登録ごとに単一のインスタンスはありません。

    例えば

    <前>ウィズウィズ

    これを行う正しい方法は...

    <前>ウィズウィズ SingleInstance

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ rokuビデオノードは常にタスクスレッドで作成する必要がありますか?