Question

Nous utilisons Ninject avec Caliburn.Micro pour créer une application Silverlight MVVM WCF. La question que j'ai est le cycle de vie de mes modèles de vue.

J'ai créé un module simple ninject pour lier mon modèle de vue et le client WCF.

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

Dans mon IIdCardViewModel je l'ai demandé il hériter de IDisposable, parce que je veux enregistrer et de registre pour des événements WCF et quelques références non gérés locales.

Cependant, Dispose est jamais appelé.

Je regardai en ajoutant une désactivation à Éliminez d'appel comme ceci:

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

Mais cela m'a forcé à ajouter deux choses, une dérogation Unload dans mon IDCardModule que récupéré l'objet et il a publié:

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

et soit .InThreadScope () ou .InSingletonScope () pour ma méthode Bind en charge.

Y at-il un moyen plus facile de forcer une désactivation sur un objet spécifique? Ou devrais-je regarder dans un autre cadre du CIO?

J'examiné IStartable et avait des problèmes similaires. De plus, je l'ai lu en profondeur l'article de Nate où il a un bloc d'activation et enveloppe tout dans une déclaration à l'aide. Ma question il y a que mon modèle de vue peut être longue marche et je ne crois pas sa solution fonctionnera ici. De plus, ayant un fil spécial qui dort et appelle GC.Collect, ne sentait pas bon non plus.

Était-ce utile?

La solution

InTransientScoped cycle de vie des objets est pas géré par Ninject. Cela signifie que les objets theese ne sont pas disposées et activé. Si votre modèle de vue est injecté à un autre objet, vous pouvez utiliser InParentScope de l'extension de la portée du nom. Voir mon blogpost sur les étendues supplémentaires de Ninject: http://www.planetgeek.ch/2010/12/08/how-to-use-the-additional-ninject-scopes-of-namedscope/

Autres conseils

Lucas B,

Je ne sais pas si ça va vous aider mais j'eu des problèmes d'élimination avec mes objets menant aussi dans certains cas à une utilisation énorme de mémoire. J'ai découvert qu'il était un problème de la souscription d'événements. Chaque fois que j'adhérait à un événement, je n'a jamais été à après le désabonnement la fin de l'événement. Pour autant que je comprends, un objet n'est pas détruite si elle est toujours abonnée à un événement ... Alors assurez-vous de le faire. (- =)

L'espoir de cette aide, même si elle est pas totalement lié à vous postez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top