Frage

Wir verwenden Ninject mit Caliburn.micro, um eine MVVM -WCF -Silverlight -App zu erstellen. Das Problem, das ich habe, ist mit dem Lebenszyklus meiner Ansichtsmodelle.

Ich habe ein einfaches Ninjektmodul erstellt, um mein Ansichtsmodell und mein WCF -Client zu binden.

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

In meinem IidCardViewModel habe ich es von idisposable erben, da ich mich für WCF-Ereignisse und einige lokale nicht verwaltete Referenzen registrieren und entfernen möchte.

Entsorgung wird jedoch nie angerufen.

Ich habe mir eine Deaktivierung hinzufügen, die ich so aufzurufen hatte, wie folgt:

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

Aber das hat mich gezwungen, zwei Dinge hinzuzufügen. Eine Entladeüberschreibung in meiner IdCardmodule, die das Objekt abgerufen und veröffentlicht hat:

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

und entweder .inThreadScope () oder .inSingletonScope () zu meiner Bindungsmethode in der Last.

Gibt es eine einfachere Möglichkeit, eine Deaktivierung eines bestimmten Objekts zu erzwingen? Oder sollte ich mir ein anderes IOC -Framework ansehen?

Ich habe mich mit iStartable angesehen und hatte ähnliche Probleme. Außerdem habe ich ausführlich gelesen Nates Artikel wo er einen Aktivierungsblock hat und alles in eine verwendete Anweisung einbringt. Mein Problem dort ist, dass mein Ansichtsmodell langlebig sein kann und ich glaube nicht, dass seine Lösung hier funktionieren wird. Außerdem riecht auch ein spezieller Faden, der schläft und GC.Collect nennt, auch nicht richtig.

War es hilfreich?

Lösung

IntransientScoped -Objekte Lebenszyklus werden nicht ninjekts behandelt. Dies bedeutet, dass die Objekte nicht entsorgt und deaktiviert sind. Wenn Ihr Ansichtsmodell einem anderen Objekt injiziert wird, können Sie über die genannte Umfangserweiterung unparentscope verwenden. Sehen Sie sich meinen Blogpost über zusätzliche Ninjektbereiche an: http://www.planetgeek.ch/2010/12/08/how-to-use-the-additional-inject-scopes-ofscope/

Andere Tipps

Lucas B,

Ich bin mir nicht sicher, ob dies Ihnen helfen wird, aber ich hatte Entsorgungsprobleme mit meinen Objekten, die in einigen Fällen zu einem großen Speichergebrauch zu führen waren. Ich fand heraus, dass es sich um ein Problem des Ereignisabonnements handelte. Jedes Mal, wenn ich ein Ereignis abonnierte, habe ich mich nach dem Ereignisabschluss nie abgemeldet. Soweit ich weiß, wird ein Objekt nicht zerstört, wenn es noch ein Ereignis abonniert ... also stellen Sie dies sicher ( -=).

Hoffe diese Hilfe, auch wenn es nicht vollständig mit dir zusammenhängt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top