Search code examples
c#wpfinversion-of-controlmvvm-lightwindows-store-apps

how to use MVVMLight SimpleIoc?


I'm revamping my software which has messy Messenger.Default(...) bits.

Is there any cheat sheet to know MVVMLight SimpleIoc usage (not general IoC description)?


Solution

  • SimpleIoc crib sheet:

    1. You register all your interfaces and objects in the ViewModelLocator

      class ViewModelLocator 
      { 
          static ViewModelLocator() 
          {         
              ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);          
              if (ViewModelBase.IsInDesignModeStatic) 
              {              
                  SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();          
              }          
              else         
              {              
                  SimpleIoc.Default.Register<IDataService, DataService>();          
              }          
              SimpleIoc.Default.Register<MainViewModel>();                  
              SimpleIoc.Default.Register<SecondViewModel>(); 
          }      
      
      
          public MainViewModel Main 
          {  
              get  
              {      
                  return ServiceLocator.Current.GetInstance<MainViewModel>();  
              } 
          }
      }
      
    2. Every object is a singleton by default. To resolve an object so that it's not a singleton you need to pass a unique value to the GetInstance call:

      SimpleIoc.Default.GetInstance<MainViewModel>(Guid.NewGuid().ToString());
      
    3. To register a class against an interface:

      SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();
      
    4. To register a concrete object against an interface:

      SimpleIoc.Default.Register<IDataService>(myObject);
      
    5. To register a concrete type:

      SimpleIoc.Default.Register<MainViewModel>();
      
    6. To resolve an object from an interface:

      SimpleIoc.Default.GetInstance<IDataService>();
      
    7. To resolve an object directly (does buildup and dependency resolution):

      SimpleIoc.Default.GetInstance<MainViewModel>();
      
    8. MVVM makes doing design-time data really easy:

      if (ViewModelBase.IsInDesignModeStatic) 
      {              
          SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();          
      }          
      else         
      {              
          SimpleIoc.Default.Register<IDataService, DataService>();          
      }
      

    If you're in design-time mode it will automatically register your design-time services, making it really easy to have data in your viewmodels and views when working in the VS designer.