2013-12-05 4 views
0

Я пишу приложение WPF с использованием PRISM 4.1 & Unity. В приложении будет настроен каждый компонент пользовательского интерфейса, включая сам Shell!Как сохранить конфигурацию оболочки с помощью PRISM 4.1 & Unity?

E.g. У меня есть интерфейс под названием IShell. Потребители приложения могут иметь собственную реализацию IShell, если они не удовлетворены моей реализацией по умолчанию, которая имеет определенные Регионы и Представления определенным образом.

Теперь из моего класса Bootstrapper (который наследует UnityBootstrapper), я хочу знать тип зарегистрированного для IShell с контейнером Unity. Override CreateShell вернет настроенный тип IShell.

Мой App.config выглядит следующим образом:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/> 
    </configSections> 
    <unity> 
    <container> 
     <register type="Interfaces.IShell, Interfaces" mapTo="PrismApp.Shell, PrismApp"/> 
    </container> 
    </unity> 
    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 
    </startup> 
</configuration> 

В классе Bootstrapper, я следующий код:

public class PrismAppBootstrapper : UnityBootstrapper 
{ 
    protected override DependencyObject CreateShell() 
    { 
     var obj = ServiceLocator.Current.GetInstance<IShell>() as DependencyObject; 
     return obj; 
    } 
} 

В App.xaml.cs приложения WPF, я имею в инстанцировании PrismAppBootstrapper:

PrismAppBootstrapper prismAppBootstrapper = new PrismAppBootstrapper(); 
     prismAppBootstrapper.Run(); 

Однако, когда я запускаю этот код, я получаю исключение : "InvalidOperationException - текущий тип, Interface.IShell, является интерфейсом и не может быть сконструирован. Вам не хватает картографирования типов? "

Как решить эту проблему? Почему приложение не знать, зарегистрированный тип Ishell, который есть в app.config файл?

ответ

0

Сохраняя Shell конфигурируемый можно с контейнером Unity.

проблема заключалась в том, что мой Unity Container неправильно настроен для чтения карт/регистраций из файла app.config. Поэтому он не смог определить отображение IShell во время выполнения.

Мне пришлось переопределить другие методы наряду с CreateShell в моем классе PrismAppBootstrapper.

E.g.

public class PrismAppBootstrapper : UnityBootstrapper 
    { 
     protected override IModuleCatalog CreateModuleCatalog() 
     { 
      ModuleCatalog catalog = new ConfigurationModuleCatalog(); 
      return catalog; 
     } 

     protected override void ConfigureContainer() 
     { 
      base.ConfigureContainer(); 
      UnityConfigurationSection configurationSection = 
       (UnityConfigurationSection) ConfigurationManager.GetSection("unity"); 
      if (configurationSection != null) 
      { 
       configurationSection.Configure(this.Container); 
      } 
     } 

     protected override DependencyObject CreateShell() 
     { 
      IShell shell = this.Container.TryResolve<IShell>(); 
      return shell as Window; 
     } 

     protected override void InitializeShell() 
     { 
      base.InitializeShell(); 

      Application.Current.MainWindow = (Window)this.Shell; 
      Application.Current.MainWindow.Show(); 
     } 
    } 
-1

вы не должны использовать вместо этого контейнера в UnityBootstrapper, чтобы решить вашу оболочку ?

var obj = Container.Resolve<IShell>() as DependencyObject; 
return obj; 
+0

Я уже пробовал это. Эта перегрузка 'Resolve' больше недоступна :( – Learner

+0

Вам нужно указать UnityExtensions: с использованием Microsoft.Practices.Prism.UnityExtensions; –

Смежные вопросы