Я пытался ввести модули от своего 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)
Так или иначе, простой ха... Взгляды смущены...
Любая справка значительно ценилась бы!
Ограбить
Я думаю, что вы, вероятно, можете просто сделать это:
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 - единственные вещи, которые настраиваются в контейнере для вашего доступа в условиях модулей. Как я уже сказал, хотя вы не получите данные каких-либо экземпляров, потому что эти модули (надеюсь) еще не создаются . Вы можете получить доступ только к данным типа.
Надеюсь, это поможет.
Я думаю, что я столкнулся с аналогичной проблемой сегодня, оказывается, что призма создает оболочку перед инициализацией модулей, поэтому вы не можете вводить какие-либо услуги от модули в саму оболочку.
Попробуйте создать другой модуль, который зависит от всех остальных и реализует функциональность, которые вы хотите, вы можете добавить его в область в оболочке, чтобы отобразить список услуг. К сожалению, у меня еще не было возможности попробовать его, но это решение, которое я планирую на реализацию.
Как побочная записка, я думаю, вам нужно отметить свойство с атрибутом для использования впрыска свойства, но я мог бы быть ошибкой (прошел некоторое время, так как я играл с единством напрямую).
Отредактируйте: Вам необходимо применить зависимостьТрибут к свойствам для использования устойчивости в единстве; Вы можете прочитать об этом здесь .
var modules = new IProductModule[]
{
Container.Resolve<ProductAModule>()
//Add more modules here...
};
Container.RegisterInstance<IProductModule[]>(modules);
Это все! Используя этот код, я могу вводить мои модули в ShellViewModel и отобразить каждый модуль как кнопку в моем приложении!
Такое простое решение! От великого парня на дискуссионной группе CompositeWPF. Я рекомендую их без резерв ^ _ ^
Я думаю, вы неправильно поняли назначение модулей. Модули - это просто контейнеры для представлений и сервисов, которые вы тоже хотите использовать. С другой стороны, оболочка должна содержать только основной макет вашего приложения.
Я думаю, вам следует определить область в вашей оболочке, а затем зарегистрировать представления (которые в вашем случае являются кнопками) в этой области.
То, как вы хотите развертывать свои представления и сервисы в терминах модулей, больше зависит от того, какой уровень модульности вы ищете, т.е. если вы хотите иметь возможность развертывать представления и сервисы ModuleA независимо от представлений и услуги ModuleB и так далее. В вашем случае может быть достаточно зарегистрировать все в одном модуле.
Потратьте немного времени на то, чтобы поэкспериментировать с примерами из документации, они неплохие.
Причина, по которой ваши примеры бросают пример, заключается в том, что ваша ShellViewModel зависит от List и этот тип не зарегистрирован в Unity. Кроме того, вы регистрируете IProductModule в Unity, что не имеет смысла, поскольку интерфейс не может быть сконструирован.