Unity IoC и регистрация примитивных типов

В этот момент я столкнулся с ситуацией с использованием Unity, которую я не знаю, как решить / подойти ... Вот моя проблема.

Я разрабатываю приложение WPF и использую MVVM (Prism Implimentation, следовательно, контейнер Unity). У меня есть ViewModel под названием MenuItemsViewModel (множественное число), которое содержит IEnumerable из MenuItemViewModel (единственное число). В конструкторе MenuItemsViewModel я заполняю эту коллекцию из функции генератора, подобной этой ...

    yield return new MenuItemViewModel(eventAggregator)
    {
        Text = "Dashboard",
        CommandText = "DASHBOARD"      
    };
    yield return new MenuItemViewModel(eventAggregator)
    {
        Text = "Areas",
        CommandText = "AREAS"
    };
    yield return new MenuItemViewModel(eventAggregator)
    {
        Text = "Users",
        CommandText = "USERS"
    };  //etc....

На самом деле я не хочу этим заниматься, а скорее полагаюсь на контейнер для создания этих объектов для меня, но как, черт возьми, я могу это сделать? Я действительно не хочу, чтобы моя модель представления элементов имела какие-либо сведения о моей модели представления элементов, кроме интерфейса, который она реализует, но у меня есть около 15 таких элементов меню, каждый с разными значениями свойств.

Я не новичок в DI / IoC, но для меня это большой вопрос. Я вижу и извлекаю выгоду из внедрения моих услуг, но что вы делаете с конкретными ценностями?

Неужели я здесь совершенно неверно мыслю? Должен ли я просто разрешать конкретный экземпляр из контейнера, а затем затем устанавливать свойства? Это был бы вариант, но я хочу, чтобы мои реквизиты были доступны только для чтения, если это возможно.

Надеюсь, это достаточно ясно, .. кричите на меня, если нет :-)

Любая помощь очень ценится.


person EightyOne Unite    schedule 16.09.2010    source источник


Ответы (1)


Я бы использовал разрешенные массивы для вставки пунктов меню:

container
  .RegisterInstance("DASHBOARD", new MenuItemViewModel(...))
  .RegisterInstance("AREAS", new MenuItemViewModel(...))

  .RegisterType<MenuItemsViewModel>(
     new InjectionConstructor(new ResolvedArrayParameter<MenuItemViewModel>()))
person onof    schedule 16.09.2010
comment
Фактически, если MenuItemsViewModel имеет конструктор, который принимает MenuItemViewModel [] (должен быть массивом), тогда разрешение зависимостей по умолчанию должно сработать и автоматически внедрит все именованные экземпляры MenuItemViewModel для вас. - person Chris Tavares; 16.09.2010
comment
Гений, ... гений! Большое спасибо :-) - person EightyOne Unite; 17.09.2010