2016-07-21 4 views
0

Это пример кода, чтобы продемонстрировать мой вопрос. Для простоты я удалил другие неуместные коды.В IoC (впрыск конструктора), когда создается экземпляр инъецируемого конструктора?

public class ViewModelLocator 
{ 
    static ViewModelLocator() 
    { 
     ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 

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

     } 
     SimpleIoc.Default.Register<MainViewModel>(); 
    } 

    public MainViewModel Main 
    { 
     get 
     { 
      return ServiceLocator.Current.GetInstance<MainViewModel>(); 
     } 
    } 
} 

Основываясь на моем понимании в коде выше, если приложение находится в режиме разработки, когда метод/конструктор должен параметр типа IDataService, экземпляр DesignDataService передается в качестве параметра, и экземпляр DataService иначе , Теперь, на мой вопрос, когда создается экземпляр типа IDataService? Возможно ли, чтобы объект типа IDataService имел параметр в его конструкторе?

PS: Я новичок в wpf, шаблоне MVVM и концепции Ioc. Поэтому, пожалуйста, объясните это простыми словами. Благодарю.

ответ

0

Образец создан лениво, поэтому он создается при первом доступе. В некотором роде он работает как шаблон Singleton. Однако все службы управляются в одном и том же локаторе службы.

Вот простой локатор минус аргумент стражники:

public static class Locator 
{ 
    private static Dictionary<Type, Lazy<object>> _cache = new Dictionary<Type, Lazy<object>>(); 

    public static void Register<TService, TProvider>() 
     where TService : TProvider 
     where TProvider : new() 
    { 
     _cache.Add(typeof(TService), new Lazy<object>(() => new TProvider())); 
    } 

    public static TService GetInstance<TService>() 
    { 
     return (TService)_cache[typeof(TService)].Value; 
    } 
} 

Что касается параметризованных конструкторов, вы можете зарегистрировать их как это:

SimpleIoc.Default.Register<IService>(() => new RealService(param1, param2)); 
Смежные вопросы