Призма 2.1 модуля введения в ViewModel

Я пытался ввести модули от своего ModuleCatalog в ViewModel моего Shell, но у меня нет большой удачи...

Я создаю ModuleCatalog в своем Bootstrapper, и мой модуль добирается на экран от его Инициализатора без проблемы. Однако я хотел бы смочь связать свой список модулей к контейнеру с DataTemplate, который позволил им быть запущенными из меню!

Вот мой файл Boostrapper, я буду добавлять больше модулей, в то время как времена продолжаются, но на данный момент, он просто содержит мой скорее изобретенный "ProductAModule":

public class Bootstrapper : UnityBootstrapper
{
    protected override void ConfigureContainer()
    {
        Container.RegisterType<IProductModule>();

        base.ConfigureContainer();
    }

    protected override IModuleCatalog GetModuleCatalog()
    {
        return new ModuleCatalog()
            .AddModule(typeof(ProductAModule));
    }

    protected override DependencyObject CreateShell()
    {
        var view = Container.Resolve<ShellView>();
        var viewModel = Container.Resolve<ShellViewModel>();
        view.DataContext = viewModel;
        view.Show();

        return view;
    }
}

При следовании за этим вот ViewModel моего Shell:

public class ShellViewModel : ViewModelBase
{
    public List<IProductModule> Modules { get; set; }

    public ShellViewModel(List<IProductModule> modules)
    {
        modules.Sort((a, b) => a.Name.CompareTo(b));
        Modules = modules;
    }
}

Как Вы видите, я пытаюсь ввести Список IProductModule (к которому ProductAModule наследовал некоторые свои свойства и методы) так, чтобы он мог затем быть связан с Представлением моего Shell. Там что-то ДЕЙСТВИТЕЛЬНО просто, я отсутствую, или разве это не может быть сделано с помощью Единицы МОК? (Я видел сделанный с расширением StructureMap для Призмы),

Еще одна вещь... При запуске приложения в точке ShellViewModel разрешается Контейнером в Bootstrapper, я получаю следующее исключение:

Разрешение зависимости перестало работать, введите = "PrismBasic. Shell. ViewModels. ShellViewModel", называют = "". Сообщение об исключении: текущая операция сборки (создают ключевой Ключ Сборки [PrismBasic. Shell. ViewModels. ShellViewModel, пустой указатель]), перестал работать: модули параметра не могли быть разрешены при попытке назвать конструктора PrismBasic. Shell. ViewModels. ShellViewModel (Система. Наборы. Универсальный. Список '1 [[PrismBasic. ModuleBase. IProductModule, PrismBasic. ModuleBase, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] модули). (Тип стратегии BuildPlanStrategy, индекс 3)

Так или иначе, простой ха... Взгляды смущены...

Любая справка значительно ценилась бы!

Ограбить

5
задан Robert Reid 21 January 2010 в 21:20
поделиться

4 ответа

Я думаю, что вы, вероятно, можете просто сделать это:

public class Bootstrapper : UnityBootstrapper
{
    protected override void ConfigureContainer()
    {
        Container.RegisterType<IProductModule>();

        base.ConfigureContainer();
    }

    private static ObservableCollection<IProductModule> _productModules = new Obser...();
    public static ObservableCollection<IProductModule> ProductModules
    { 
         get { return _productModules; } 
    }
    protected override IModuleCatalog GetModuleCatalog()
    {
        var modCatalog = new ModuleCatalog()
            .AddModule(typeof(ProductAModule));
        //TODO: add all modules to ProductModules collection

        return modCatalog;
    }

   ...
}

, тогда у вас будет статическое свойство, которое все может связаться напрямую, или можно использовать из вашего ViewModel.


Вот как получить список имен модулей, которые были зарегистрированы в каталоге модуля.

public class MyViewModel : ViewModel
{

      public ObservableCollection<string> ModuleNames { ... }
      public MyViewModel(IModuleCatalog catalog)
      {
           ModuleNames = new ObservableCollection<string>(catalog.Modules.Select(mod => mod.ModuleName));
      }
}

Это в значительной степени. Imodulecatalog и imoduleManager - единственные вещи, которые настраиваются в контейнере для вашего доступа в условиях модулей. Как я уже сказал, хотя вы не получите данные каких-либо экземпляров, потому что эти модули (надеюсь) еще не создаются . Вы можете получить доступ только к данным типа.

Надеюсь, это поможет.

2
ответ дан 15 December 2019 в 06:26
поделиться

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

Попробуйте создать другой модуль, который зависит от всех остальных и реализует функциональность, которые вы хотите, вы можете добавить его в область в оболочке, чтобы отобразить список услуг. К сожалению, у меня еще не было возможности попробовать его, но это решение, которое я планирую на реализацию.

Как побочная записка, я думаю, вам нужно отметить свойство с атрибутом для использования впрыска свойства, но я мог бы быть ошибкой (прошел некоторое время, так как я играл с единством напрямую).


Отредактируйте: Вам необходимо применить зависимостьТрибут к свойствам для использования устойчивости в единстве; Вы можете прочитать об этом здесь .

0
ответ дан 15 December 2019 в 06:26
поделиться
var modules = new IProductModule[]
{
    Container.Resolve<ProductAModule>()
    //Add more modules here...
};
Container.RegisterInstance<IProductModule[]>(modules);

Это все! Используя этот код, я могу вводить мои модули в ShellViewModel и отобразить каждый модуль как кнопку в моем приложении!

Такое простое решение! От великого парня на дискуссионной группе CompositeWPF. Я рекомендую их без резерв ^ _ ^

0
ответ дан 15 December 2019 в 06:26
поделиться

​​Я думаю, вы неправильно поняли назначение модулей. Модули - это просто контейнеры для представлений и сервисов, которые вы тоже хотите использовать. С другой стороны, оболочка должна содержать только основной макет вашего приложения.

Я думаю, вам следует определить область в вашей оболочке, а затем зарегистрировать представления (которые в вашем случае являются кнопками) в этой области.

То, как вы хотите развертывать свои представления и сервисы в терминах модулей, больше зависит от того, какой уровень модульности вы ищете, т.е. если вы хотите иметь возможность развертывать представления и сервисы ModuleA независимо от представлений и услуги ModuleB и так далее. В вашем случае может быть достаточно зарегистрировать все в одном модуле.

Потратьте немного времени на то, чтобы поэкспериментировать с примерами из документации, они неплохие.

Причина, по которой ваши примеры бросают пример, заключается в том, что ваша ShellViewModel зависит от List и этот тип не зарегистрирован в Unity. Кроме того, вы регистрируете IProductModule в Unity, что не имеет смысла, поскольку интерфейс не может быть сконструирован.

1
ответ дан 15 December 2019 в 06:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: