0

Ninject と Caliburn.Micro を使用して、MVVM WCF Silverlight アプリを作成しています。私が抱えている問題は、ビュー モデルのライフ サイクルにあります。

ビュー モデルと wcf クライアントをバインドする単純な ninject モジュールを作成しました。

   public class IDCardModule : NinjectModule
   {
        public override void Load()
        {
            Bind<IIdCardManagerClient>().To<IdCardManagerClient>();
            Bind<IDCard.SL.ViewModel.IIdCardViewModel>().To<IDCard.SL.ViewModel.IdCardViewModel>();
        }
   }

私の IIdCardViewModel では、wcf イベントといくつかのローカルの管理されていない参照を登録および登録解除したいので、IDisposable から継承する必要がありました。

ただし、Dispose が呼び出されることはありません。

次のように dispose を呼び出すために非アクティブ化を追加することを検討しました。

Bind<IDCardExclude.SL.ViewModel.IIdCardExclusionViewModel>().To<IDCardExclude.SL.ViewModel.IdCardExclusionViewModel>().OnDeactivation(
                m => m.Dispose());

しかし、そのために 2 つのことを追加する必要がありました。それは、オブジェクトを取得して解放する IDCardModule の Unload オーバーライドです。

var releaseMe = this.Kernel.Get<IIdCardViewModel>();
this.Kernel.Components.Get<Ninject.Activation.Caching.ICache>().Release(releaseMe);

.InThreadScope() または .InSingletonScope() を Load の Bind メソッドに追加します。

特定のオブジェクトを強制的に非アクティブ化する簡単な方法はありますか? それとも、別の IOC フレームワークを調べる必要がありますか?

IStartable を調べたところ、同様の問題がありました。同様に、Nate の詳細な記事を読んで、アクティベーション ブロックがあり、すべてを using ステートメントでラップしています。私の問題は、ビューモデルが長時間実行される可能性があり、彼のソリューションがここで機能するとは思わないことです。同様に、スリープ状態で GC.Collect を呼び出す特別なスレッドを使用することも適切ではありません。

4

2 に答える 2

1

InTransientScopedオブジェクトのライフサイクルはNinjectによって管理されていません。これは、これらのオブジェクトが破棄および非アクティブ化されていないことを意味します。ビューモデルが別のオブジェクトに挿入されている場合は、名前付きスコープ拡張機能からInParentScopeを使用できます。Ninjectの追加スコープについては、私のブログ投稿を参照してください:http ://www.planetgeek.ch/2010/12/08/how-to-use-the-additional-ninject-scopes-of-namedscope/

于 2011-01-26T22:58:00.087 に答える
0

ルーカス・B

これが役立つかどうかはわかりませんが、オブジェクトの処理に問題があり、場合によっては大量のメモリが使用されていました。イベントサブスクリプションの問題であることがわかりました。イベントにサブスクライブするたびに、イベントの完了後にサブスクライブを解除することはありませんでした. 私が理解している限り、オブジェクトがまだイベントにサブスクライブしている場合、オブジェクトは破棄されません...したがって、必ずそうしてください( -= )。

投稿に完全に関連していなくても、このヘルプが役立つことを願っています.

于 2011-01-26T16:35:41.940 に答える