You cannot do this at a time. That's why:
Internally, the SimpleIoc object contains an instance dictionary:
Dictionary<Type, Dictionary<string, object>> _instancesReDictionary<Type, Dictionary<string, object>> _instancesRegistrygistry
When you call GetAllInstances, what actually happens under the hood:
public IEnumerable<TService> GetAllInstances<TService>() { var serviceType = typeof(TService); return GetAllInstances(serviceType) .Select(instance => (TService)instance); }
Which in turn causes:
public IEnumerable<object> GetAllInstances(Type serviceType) { lock (_factories) { if (_factories.ContainsKey(serviceType)) { foreach (var factory in _factories[serviceType]) { GetInstance(serviceType, factory.Key); } } } if (_instancesRegistry.ContainsKey(serviceType)) { return _instancesRegistry[serviceType].Values; } return new List<object>(); }
Basically, everything he does is check if your type exists in one or more dictionaries. This is a direct comparison, therefore, does not take into account the object A inherited from the object B.
What you can do, which will take more effort, but will do what you want, uses Messenger to send a βCleanupβ message to all your view models:
ViewModelLocator:
public static void Cleanup() { Messenger.Default.Send<CleanUp>(new CleanUp()); }
ViewModel:
public class MainViewModel : ViewModelBase { public MainViewModel(LocalServer server) { this.Server = server; Messenger.Default.Register<CleanUp>(this,CallCleanUp); } private void CallCleanUp() { CleanUp(); }
It will work. If you want to do this automatically, create a class that inherits from ViewModelBase, which has this logic in it, and you have all other types of models inherited from this class, not ViewModelBase.